为什么函数的引用作为SCALAR返回

时间:2015-08-05 13:18:07

标签: perl

我无法理解,如果我取消注释返回行,那么输出将是" 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'})

2 个答案:

答案 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";