我无法理解,如果我取消注释返回行,那么输出将是" CODE"其他" SCALAR" ...为什么会这样?
use strict;
sub test {
my ($abc,$grab) = @_;
print 'i m here';
print $abc;
## return []; if uncommented then output will be "REF" else "SCALAR"
}
my $pass= "i m good";
my %my_hash = ();
$my_hash{'fun'} = \&test($pass);
print ref($my_hash{'fun'})
答案 0 :(得分:5)
您没有参考某个功能。
当你写:
\&test($pass);
这是一个函数调用(你有一个参数列表)。
因此,使用参数test
调用函数$pass
,然后引用返回的值(除非您知道并具体说明,否则不应将函数调用作为&
的前缀渴望它的作用。)
如果您想要引用test
,则应使用
$my_hash{'fun'} = \&test; ### (1)
如果您想要引用一个使用当前范围内的参数test
调用$pass
的函数,您应该使用:
$my_hash{'fun'} = sub { test($pass) }; ### (2)
请注意,后者将在当前范围内的变量$pass
上创建一个闭包。要调用(1),请使用$my_hash{fun}->($some_arg)
。要调用(2),请使用$my_hash{fun}->()
。
答案 1 :(得分:5)
没有隐式return
,子例程返回最后一个表达式的值。成功时print
返回1,即标量。
\&test($pass)
与\ test($pass)
相同,即它计算为对子test
返回的值的引用。如果它从print
返回1,您将获得SCALAR,如果它返回[]
,您将获得REF,因为您有对数组的引用的引用。您也可以通过解除引用来验证它:
print ${ $my_hash{fun} }, ': ', ref $my_hash{fun}, "\n";