使用标量引用子程序

gat*_*ina 2 perl

是否可以使下面的示例正常工作,以便通过标量变量存储和调用子例程的名称?

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)

TLP*_*TLP 6

您可以将其放入哈希中:

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)

为了摆脱它。