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

时间:2016-11-23 10:46:48

标签: perl subroutine dereference perl-hash

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

%hashfun = (

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

);

我尝试过以下等等。

print "\n $hashfun{start} \n";

导致以下输出:

  

CODE(< HexaDecimal Value>)

然后我试了

print "\n $hashfun{start}->() \n";

导致以下

  

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

如何解决?

1 个答案:

答案 0 :(得分:7)

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

print "\n";
$hashfun{start}->();
print"\n";

print$hashfun{start}的实际调用非常重要,因为这会返回1。那是因为Perl中的sub总是返回sub中最后一个语句的返回值(可以是return)。这是一个print。如果打印成功,则print的返回值为1。所以print "\n", $hashfun{start}->(), "\n";会输出

hello
1

1)其实你可以,但你真的不应该。print "\n@{[&{$hashfun{start}}]}\n";会奏效。这非常神奇,你真的不应该这样做。功能

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