Perl 动态/符号函数参考

Perl dynamic / symbolic function reference

给定包名称 $package 和该包中的函数名称 $function,我可以创建对该函数的引用:

my $ref = eval( "\&${package}::${function}" );

作为一个完整的例子:

#!/usr/bin/perl -w

use strict;

package foo;

sub func()
{
    print "foo::func\n";
}

package main;

my $package = "foo";
my $function = "func";

my $ref = eval( "\&${package}::$function" );
$ref->();

我不是特别喜欢那里的 eval() 并且想知道 如果没有 eval() 是否可以达到相同的结果?

使用字符串来引用子例程很少是正确的方法。如果你这样做,你很可能做错了什么。您可以使用代码引用在标量或散列中存储对函数的引用。散列允许您通过字符串输入正确查找代码引用。

use strict;
use warnings;

package foo;
sub func() {
    print "inside foo::func (@_)\n";
}

package main;

# use a direct reference, in a scalar variable
my $ref = \&foo::func;
$ref->(1,2,3);

# ...or in a hash
my $pack = "foo";
my $func = "func";
my %table = ( foo => { func => \&foo::func } );
$table{$pack}{$func}->(qw(a b c));

输出:

inside foo::func (1 2 3)
inside foo::func (a b c)

你只需要这个:

my $ref = \&{ "${package}::$name" };

my $ref = \&{ $package . "::" . $name };

使用表达式生成变量名称,其中期望变量名称称为 symbolic reference。这些通常被 use strict; 禁止(特别是 use strict qw( refs );),但 \& 被豁免。