我想在调用之前检查子程序是否存在.例如:
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)
这很好,但是知道为什么第一个代码不起作用会很好吗?
my $sub = main->can("print$_");
if ($sub) {
$sub->();
}
Run Code Online (Sandbox Code Playgroud)
从 perldoc
可以检查对象或类是否有一个名为METHOD的方法.如果是,则返回对sub的引用.如果没有,则返回undef.这包括由$ obj,CLASS或VAL继承或导入的方法.
您正在尝试参考,然后知道该子项是否存在。首先使用对的子例程名称进行检查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)