給定該包中的包名$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()嗎?
uj5u.com熱心網友回復:
你只需要這樣:
my $ref = \&{ "${package}::$name" };
或者
my $ref = \&{ $package . "::" . $name };
使用生成變數名稱的運算式(其中需要變數名稱)稱為符號參考。這些通常被use strict;(特別是use strict qw( refs );)禁止,但\&被豁免。
uj5u.com熱心網友回復:
使用字串來參考子程式很少是正確的方法。如果你這樣做,你很可能做錯了什么。您可以使用代碼參考以標量或散列的形式存盤對函式的參考。哈希允許您通過字串輸入正確查找代碼參考。
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/475694.html
