检查Perl中是否存在子例程

Håk*_*and 4 perl

我想在调用之前检查子程序是否存在.例如:

use warnings;
use strict;

my @names=qw (A B);

for (@names) {
  my $sub=\&{"print$_"};
  if (exists &{$sub}) {
    &$sub();
  }
}

sub printA {
  print "hello A\n";
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码不起作用.它给出了错误:

Undefined subroutine &main::printB
Run Code Online (Sandbox Code Playgroud)

我知道我可以用eval,

for (@names) {
  my $sub=\&{"print$_"};
  eval {
    &$sub();
  };
  if ($@) {
    print "$_ does not exist..\n";
  }
}
Run Code Online (Sandbox Code Playgroud)

这很好,但是知道为什么第一个代码不起作用会很好吗?

Сух*_*й27 6

my $sub = main->can("print$_");
if ($sub) {
  $sub->();
}
Run Code Online (Sandbox Code Playgroud)

perldoc

可以检查对象或类是否有一个名为METHOD的方法.如果是,则返回对sub的引用.如果没有,则返回undef.这包括由$ obj,CLASS或VAL继承或导入的方法.

  • 这样找一个方法,而不是一个子程序.只使用`my $ sub = main-> can("print $ _")才有意义;`你是否跟进`main - > $ sub();`,这不是OP所要求的. (2认同)

Mic*_*man 6

您正在尝试参考,然后知道该子项是否存在。首先使用对的子例程名称进行检查exists

use strict;
use warnings;

foreach (qw(A B)) {
    my $name = 'print' . $_;
    if (exists &{$name}) {
        my $s = \&{$name};
        $s->();
    }
}

sub printA {
    print "hello A"
}
Run Code Online (Sandbox Code Playgroud)