gpt4 book ai didi

perl - 从需要的 perl 脚本访问 sub

转载 作者:行者123 更新时间:2023-12-02 07:01:53 24 4
gpt4 key购买 nike

我将使用 require 语句导入一些 perl 代码。我要导入的代码在 mylibA.pl 中:

#!/usr/bin/perl
package FOO::BAR;

sub routine {
print "A message!\n";
}

mylibB.pl:

#!/usr/bin/perl
package FOO::BAZ;

sub routine {
print "Another message!\n";
}

然后我将像这样使用它:

#!/usr/bin/perl
foreach my $lib (qw/ mylibA.pl mylibB.pl /){
require $lib;
print "Make a call to ${lib}'s &routine!\n";
}

我的脚本有没有办法找出使用 require 语句引入的命名空间?

最佳答案

哇。我不得不说这是我一段时间以来看到的最有趣的 Perl 问题之一。从表面上看,这似乎是一个非常简单的请求——获取一个包含的模块的命名空间,但实际上没有办法做到这一点。您可以在包裹中获取它,但不能从包裹外获取。我尝试使用 EXPORT 将本地包名称发送回调用者脚本,但由于“使用”和“要求”的工作方式不同,最终无济于事。更多模块类型的方法可能会使用“use”语句,但所需脚本能够自行运行的要求阻止了该方法。剩下要做的唯一一件事就是直接污染调用者的命名空间并希望得到最好的结果(假设调用者没有包命名空间)——模块旨在防止这种情况。

顺便说一句——我不敢相信这真的有效——在严格模式下,同样如此。

调用者.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__

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;

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;

结果:

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

关于perl - 从需要的 perl 脚本访问 sub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19453201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com