Вот пример, как я это сделал: Как это работает? Он проверяет какое-то условие, и создание объекта зависит от этого условия. И подпрограмма также проверяет ссылочного типа и называет правильный метод
файл /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#
Используя ваш любимый текстовый редактор. – PSIAlt