gpt4 book ai didi

perl - 调用可能存在于包中的函数

转载 作者:行者123 更新时间:2023-12-04 02:18:08 24 4
gpt4 key购买 nike

我有一个脚本可以解析包列表。直到运行时才知道实际的包列表。一些这些包有一对子程序。子例程的名称是固定的(preBuild 和 postBuild)。我在调用这些子例程时遇到问题。下面的代码说明了我的尝试。问题是:如何调用一个可能存在的函数,而当它不存在时忽略它。

foreach my $p (@pkgList) {
$funcName="$p::preBuild";
## 1. doesn't work. Never defined
if (defined (&$funcName)) {
&$funcName
}
## 2. Cops out first time it hits a packet without the subroutine
if (ref (&$funcName) eq "CODE") {
&$funcName
}
## 3. same as 2.
eval $funcName
}

最佳答案

Perl 提供了 UNIVERSAL所有包的基类,UNIVERSAL 提供can(subname) 方法。有了它,您可以测试任意包中任意函数的可用性。

sub Foo::foo { 42 }
sub Baz::foo { 19 }
foreach $pkg (qw(Foo Bar Baz Quux)) {
if ($pkg->can('foo')) {
print "foo in $pkg: ", $pkg->foo(), "\n";
} else {
print "foo in $pkg: not found\n";
}
}

输出:

foo in Foo: 42
foo in Bar: not found
foo in Baz: 19
foo in Quux: not found

关于perl - 调用可能存在于包中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32790825/

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