我将使用该require语句导入一些perl代码.我要导入的代码是mylibA.pl:
#!/usr/bin/perl
package FOO::BAR;
sub routine {
print "A message!\n";
}
Run Code Online (Sandbox Code Playgroud)
并且mylibB.pl:
#!/usr/bin/perl
package FOO::BAZ;
sub routine {
print "Another message!\n";
}
Run Code Online (Sandbox Code Playgroud)
然后我会像这样使用它:
#!/usr/bin/perl
foreach my $lib (qw/ mylibA.pl mylibB.pl /){
require $lib;
print "Make a call to ${lib}'s &routine!\n";
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让我的脚本找出使用该require语句引入的命名空间?
哇.我不得不说这是我在一段时间内看到的最有趣的Perl问题之一.从表面上看,这似乎是一个非常简单的请求 - 得到一个包含模块的命名空间,但实际上没有办法做到这一点.您可以在包装中获得它,但不能从包装外部获得.我尝试使用EXPORT将本地软件包名称发送回调用者脚本,但由于"使用"和"需要"工作方式不同,最终无处可去.更多模块类型的方法可能会使用"use"语句,但所需脚本能够自行运行的要求阻止了这种方法.剩下要做的就是直接污染来电者
顺便说一句 - 我无法相信这确实有效 - 在严格的模式下,不会少.
caller.pl
#!/usr/bin/perl
use strict;
#package SomePackageName; #if you enable this then this will fail to work
our $ExportedPackageName;
print "Current package=".__PACKAGE__."\n";
foreach my $lib (qw/ mylibA.pl mylibB.pl /){
require $lib;
print "Make a call to ${lib}'s &routine!\n";
print "Package name exported=".$ExportedPackageName."\n";
$ExportedPackageName->routine;
} #end foreach
print "Normal Exit";
exit;
__END__
Run Code Online (Sandbox Code Playgroud)
mylibA.pl
#!/usr/bin/perl
package FOO::BAR;
use strict;
#better hope the caller does not have a package namespace
$main::ExportedPackageName=__PACKAGE__;
sub routine {
print "A message from ".__PACKAGE__."!\n";
}
1;
Run Code Online (Sandbox Code Playgroud)
mylibB.pl
#!/usr/bin/perl
package FOO::BAZ;
use strict;
#better hope the caller does not have a package namespace
$main::ExportedPackageName=__PACKAGE__;
sub routine {
print "Another message, this time from ".__PACKAGE__."!\n";
}
1;
Run Code Online (Sandbox Code Playgroud)
结果:
c:\Perl>
c:\Perl>perl caller.pl
Current package=main
Make a call to mylibA.pl's &routine!
Package name exported=FOO::BAR
A message from FOO::BAR!
Make a call to mylibB.pl's &routine!
Package name exported=FOO::BAZ
Another message, this time from FOO::BAZ!
Normal Exit
Run Code Online (Sandbox Code Playgroud)