无法在perl中的子例程的哈希中触发子例程

Ihs*_*wer 1 perl subroutine dereference perl-hash

嗨,我对perl很新.我有一个包含子程序的perl哈希.我试图以我在网上找到的各种方式运行它.但似乎没有任何效果.我的代码:

%hashfun = (

start=>sub { print 'hello' },
end=>sub { print 'bye' } 

);
Run Code Online (Sandbox Code Playgroud)

我尝试了以下等等.

print "\n $hashfun{start} \n";
Run Code Online (Sandbox Code Playgroud)

这导致以下输出:

代码(<HexaDecimal Value>)

然后我试了一下

print "\n $hashfun{start}->() \n";
Run Code Online (Sandbox Code Playgroud)

这导致以下结果

代码(<HexaDecimal Value>) - >()

怎么修?

sim*_*que 7

你的最后一次尝试是正确的语法,但在错误的地方.你不能在字符串插值1中运行代码.将它移到双引号之外"".

print "\n";
$hashfun{start}->();
print"\n";
Run Code Online (Sandbox Code Playgroud)

重要的是不要print实际调用$hashfun{start},因为这会返回1.那是因为Perl中的sub总是返回sub中最后一个语句的返回值(可以是a return).在这里,它是一个print.和返回值print1如果打印成功.那么print "\n", $hashfun{start}->(), "\n";输出

hello
1


1)其实你可以,但你真的不应该.print "\n@{[&{$hashfun{start}}]}\n";将工作.这非常神奇,你真的不应该这样做.

因为数组可以插入到字符串中,所以数组deref在双引号内部工作.deref中的内容正在运行,因此&$hashfun{start}(这是一种不同的调用coderef的方式)运行.但是因为它返回1并且不是数组引用,我们需要将它包装[]进去,然后将它放入一个数组引用,然后被解除引用.请不要使用它!