【问题标题】:Cannot fire subroutine inside a hash of subroutines in perl无法在 perl 中的子例程哈希内触发子例程
【发布时间】:2017-04-07 08:00:00
【问题描述】:

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

%hashfun = (

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

);

我已经尝试了以下以及更多。

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

导致以下输出:

CODE()

然后我尝试了

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

结果如下

CODE() ->()

如何解决?

【问题讨论】:

  • 您不能在字符串插值中运行 coderef。
  • 另请参阅perlop 中的“引用和类似引用的运算符”,了解可以在字符串中插入的内容。
  • 谢谢伙计,我会@HåkonHægland
  • @simbabque 您可以在字符串中运行 coderef:my %h=(a=>sub{'hi';}); print "${\$h{a}->()} there\n"; 这并不漂亮,我不一定会推荐它,但它确实有效
  • @stevieb 我在我的回答中解释了如何使用下面的数组参考来做到这一点。我确实说过你不能是故意的。您使用标量 ref 的示例更短,但仍然很难看,不应该这样做。

标签: perl subroutine dereference perl-hash


【解决方案1】:

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

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

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

你好 1

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

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

【讨论】:

  • 是的,这是正确的答案。谢谢你。当我应用该修复程序时,数字 1 出现在打印值之后。这是为什么?以及任何摆脱它的方法。我的意思是我得到的输出是 'hello1' 和 'bye1'
  • @Ihsan 我已经解释了1 的来源。我实际上希望它直接在文本后面,如果你看一下the initial version of the answer,我就是这样。但是在我的 Perl 5.20.1 上它并没有这样做。我不确定为什么。它与评估内容的顺序有关。 print 被调用,它有三个参数。第二个参数是代码 ref,它会运行。 print 'hello' 就是这样。所以有输出。然后它返回1,它被传递给print。这两个"\n"也是……
  • .. 传递给print。我不清楚参数列表是否在内部连接和打印,或者它们是否分别打印。这也可能受到$| 的影响,但我真的不知道。也许对内部有更深入了解的人稍后会解释这一点。
猜你喜欢
  • 2014-07-02
  • 2015-07-06
  • 2012-04-25
  • 2012-10-16
  • 2013-11-04
  • 2011-02-01
  • 2013-11-20
  • 2012-08-30
  • 1970-01-01
相关资源
最近更新 更多