В приведенном ниже примере используется следующее Bar.pm
:
package Foo::Quux::Bar;
use warnings;
use strict;
sub one { 1 }
sub two { "zwei" }
sub three { 0x3333 }
1;
В вашей test-bar
программе вы можете установить хук, который будет использовать текущий каталог Bar.pm
с
#! /usr/bin/perl
use warnings;
use strict;
use File::Basename;
BEGIN {
sub find_bar {
my(undef,$name) = @_;
if (basename($name) eq "Bar.pm") {
open my $fh, "<", "./Bar.pm" or die "$0: open ./Bar.pm: $!";
$fh;
}
}
unshift @INC => \&find_bar;
}
Крючки в @INC
описаны в документации perlfunc для require
.
Теперь можно импортировать все сабвуферы, игнорируя любые import
в Foo::Quux::Bar
,
# fake use Foo::Quux::Bar
BEGIN {
require Foo::Quux::Bar;
{
no strict 'refs';
while (my($name,$glob) = each %Foo::Quux::Bar::) {
if (*{ $glob }{CODE}) {
*{ __PACKAGE__ . "::" . $name } = *{ $glob }{CODE};
}
}
}
}
Вернитесь в тестовый код, где включена прагма strict
, мы можем
print map "$_\n", one, two, three;
и получите следующий вывод:
1
zwei
13107