创建子例程的哈希,并运行一个

时间:2018-02-08 15:16:02

标签: perl

我正在尝试复制this示例中给出的解决方案。

代码如下:

use strict;
use warnings;

my %hash = (
  one => sub { print 'one'; },
  two => sub { print 'two'; },
);

$hash{one};

运行此错误时我得到的错误是:

  

在t.pl第9行的void上下文中无用的hash元素。

我做了一个正在运行的例子here

我哪里错了?

2 个答案:

答案 0 :(得分:5)

当它不是sub中定义的符号时,你需要告诉perl它是一个明确的代码引用来让它“运行”它 - 否则你只需要一个匿名哈希的代码引用,你就是试图在void上下文中使用。

您可以通过以下方式执行此操作:

$hash{one}->();

或者:

&{$hash{one}}();

或者:

$hash{one}();

答案 1 :(得分:0)

$hash{one}()$hash{one}->()相同,只是Perl允许使用任意左括号{{1}关闭括号)}] {},({以及相应的解除引用

有些人选择使用插入箭头[来确定间接特征,甚至用空格包围

我的选择是删除间接箭头->,以及任何其他不必要的非空格(我声称​​"黑暗空间" 在这里!)字符,尽可能加快我对代码的理解

您可以根据需要加载和播放此代码

->

输出

use strict;
use feature ':5.10';

my $s = [ 1, 2, 3 ];

my $subs = {
    aa => sub { [0, $s, 0] },
    bb => sub {  99 },
};

say $subs->{aa}()[1][1];

我个人认为比这样的事情更清楚

2

一次扫描需要太多扫描才能读取。但我会感激任何鼓励不同观点的评论