嗨,我对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>) - >()
如何解决?
答案 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
并且它不是数组引用,我们需要将它包装在[]
中以将其放入数组引用中,然后将其取消引用。 请不要使用它!