我有一个解析包列表的脚本。直到运行时才知道实际的包列表。 这些软件包中的一些有一些子例程。子例程的名称是固定的(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
}
答案 0 :(得分:4)
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