2013-06-10 5 views
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.

Как я могу написать оберточный модуль?

+3

Используя ваш любимый текстовый редактор. – PSIAlt

ответ

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 (defau модуль л):

#!/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# 
Смежные вопросы