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

时间:2015-09-25 21:20:14

标签: perl packages

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

1 个答案:

答案 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