[英]How can I elegantly call a Perl subroutine whose name is held in a variable?
[英]How can I call a subroutine whose name is a value in a hash, in Perl?
$ cat test.pl
use strict;
use warnings;
sub route {
print "hello, world!";
}
my %h;
$h{'a'} = 'route';
print "1\n";
$h{a};
print "2\n";
$h{a}();
print "3\n";
"$h{a}".();
$ perl test.pl
Useless use of hash element in void context at test.pl line 12.
Useless use of concatenation (.) or string in void context at test.pl line 18.
1
2
Can't use string ("route") as a subroutine ref while "strict refs" in use at test.pl line 15.
$
调用route()
的正确方法是什么?
您正尝试使用$ h {a}作为符号引用。 并且“使用严格”明确禁止这一点。 如果你关闭严格模式,那么你可以这样做:
no strict;
&{$h{a}};
但最好的方法是在哈希中存储子程序的“实际”引用。
#!/usr/bin/perl
use strict;
use warnings;
sub route {
print "hello, world!";
}
my %h;
$h{a} = \&route;
$h{a}->();
您必须取消引用包含例程名称的字符串作为子。 括号是可选的。
my $name = 'route';
&{$name};
由于您的例程名称是哈希值,因此您必须从哈希中提取它。 此外,当您使用strict
(这是一个很好的做法)时,您必须在本地禁用检查。
{
no strict 'refs';
&{$h{a}};
}
但是,正如davorg在他的回答中所建议的那样,直接在哈希中存储对sub的引用(而不是例程名称)会更好(性能方面)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.