Perl动态/符号函数引用

hwamh0ep  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(146)

给定一个名为$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(),是否也能达到同样的结果?

7kjnsjlb

7kjnsjlb1#

你所需要的就是:

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

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

使用一个表达式产生一个变量的名字,而这个表达式需要一个变量名,这被称为符号引用。这些通常被use strict;禁止(特别是use strict qw( refs );),但是\&是例外。

roejwanj

roejwanj2#

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

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)

相关问题