从require'd perl脚本访问subs

ajw*_*ood 2 perl namespaces

我将使用该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语句引入的命名空间?

Ric*_*vas 5

哇.我不得不说这是我在一段时间内看到的最有趣的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)