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 );
),但 \&
被豁免。
给定包名称 $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 );
),但 \&
被豁免。