我正在尝试复制this示例中给出的解决方案。
代码如下:
use strict;
use warnings;
my %hash = (
one => sub { print 'one'; },
two => sub { print 'two'; },
);
$hash{one};
运行此错误时我得到的错误是:
在t.pl第9行的void上下文中无用的hash元素。
我做了一个正在运行的例子here。
我哪里错了?
答案 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
一次扫描需要太多扫描才能读取。但我会感激任何鼓励不同观点的评论