4

ダウンロードサブモジュールを書いています。次のようにしたいと思います。

 Download.pm
 Download/Wget.pm
 Download/LWP.pm
 Download/Curl.pm
 Download/Socket.pm

私の Download.pm は api を提供する必要がありますsub download($url)。LWP モジュール、wgetコマンド、コマンドの順に検索します。curlこれらが存在しない場合は、Socket.

ラッパーモジュールを作成するにはどうすればよいですか?

4

1 に答える 1

2

ここにいくつかの例があります。何らかの条件をチェックし、この条件に依存するオブジェクトを作成します。また、サブルーチンは参照型をチェックし、正しいメソッドを呼び出します

ファイル /tmp/Adapt/Base.pm (基本モジュール):

#!/usr/bin/perl

package Adapt::Base;

use strict;
use warnings;

sub new {
    my $class = shift;
    my $self;
    if ( time % 3 ) {
        require "/tmp/Adapt/First.pm";
        $self = \Adapt::First->new(@_);
    }
    elsif ( time % 2 ){
        require "/tmp/Adapt/Second.pm";
        $self = \Adapt::Second->new(@_);
    }
    else {
        require "/tmp/Adapt/Default.pm";
        $self = \Adapt::Default->new(@_); 
    }
    bless( $self, $class );
}

sub somesub {
    my $s = shift;
    my $self = $$s;
    if ( ref( $self ) eq 'Adapt::First' ) {
        $self->firstsub();
    }
    elsif ( ref( $self ) eq 'Adapt::Second' ) {
        $self->secondsub();
    }
    else {
        $self->defaultsub();
    }
}

1;

ファイル /tmp/Adapt/First.pm (いくつかのモジュール):

#!/usr/bin/perl

package Adapt::First;

use strict;
use warnings;

sub new {
    my $class = shift;
    my $self = {};
    bless( $self, $class );
}

sub firstsub {
    print "I am 1st sub.\n";
}

1;

ファイル /tmp/Adapt/Second.pm (別のモジュール):

#!/usr/bin/perl

package Adapt::Second;

use strict;
use warnings;

sub new {
    my $class = shift;
    my $self = {};
    bless( $self, $class );
}

sub secondsub {
    print "I am 2nd sub.\n";
}

1;

およびファイル /tmp/Adapt/Default.pm (デフォルト モジュール):

#!/usr/bin/perl

package Adapt::Default;

use strict;
use warnings;

sub new {
    my $class = shift;
    my $self = {};
    bless( $self, $class );
}

sub defaultsub {
    print "I am default sub.\n";
}

1;

そしてテストスクリプト:

#!/usr/bin/perl

use strict;
use warnings;

require '/tmp/Adapt/Base.pm';

for (0..10) {
    my $test = Adapt::Base->new;
    $test->somesub;
    sleep 1;
}

出力:

dev# perl /tmp/adapt.pl
I am default sub.
I am 1st sub.
I am 1st sub.
I am 2nd sub.
I am 1st sub.
I am 1st sub.
I am default sub.
I am 1st sub.
I am 1st sub.
I am 2nd sub.
I am 1st sub.
dev# 
于 2013-06-10T08:48:56.327 に答える