是否可以使下面的示例正常工作,以便通过标量变量存储和调用子例程的名称?
use strict;
use warnings;
sub doit {
my ($who) = @_;
print "Make us some coffee $who!\n";
}
sub sayit {
my ($what) = @_;
print "$what\n";
}
my $action = 'doit';
$action('john');
Run Code Online (Sandbox Code Playgroud)
您可以将其放入哈希中:
my %hash;
$hash{'doit'} = \&doit;
$hash{'doit'}->('Mike');
Run Code Online (Sandbox Code Playgroud)
或者你可以立即将其设为匿名子
my %hash = ( doit => sub { ... },
sayit => sub { .... },
....);
Run Code Online (Sandbox Code Playgroud)
正如达达提到的,它是一个标量值,因此它也可以放入标量变量中:
my $command = \&doit;
$command->('Mike');
Run Code Online (Sandbox Code Playgroud)
从技术上讲,您还可以将字符串放入标量中,并将其用作子例程:
my $action = 'doit';
$action->('Mike'); # breaks strict 'refs'
Run Code Online (Sandbox Code Playgroud)
但如果你正在使用use strict,就像你应该的那样,它不会允许你,并且会因错误而死亡:
Can't use string ("doit") as a subroutine ref while "strict refs" in use...
Run Code Online (Sandbox Code Playgroud)
所以不要这样做。如果你想使用字符串来引用 subs,使用哈希是正确的方法。但如果你还想的话,你可以
no strict 'refs';
Run Code Online (Sandbox Code Playgroud)
为了摆脱它。