我开始学习Perl,所以我想在这里阅读一些帖子。现在我遇到了这段代码https://stackoverflow.com/a/22310773/2173773(在这里有所简化):
echo "1 2 3 4" | perl -lane'
$h{@F} ||= [];
print $_ for keys %h;
'
此代码的作用是什么,为什么此代码会打印4
?
我曾尝试在http://perldoc.perl.org/perlreftut.html学习Perl参考文献,但我仍然无法理解这一点。
(我很困惑这一行:$h{@F} ||= []
..)
答案 0 :(得分:5)
-n
选项(-lane
的一部分)会导致Perl为每个输入行执行给定的代码。-a
选项(与-n
或-p
选项一起使用时)会导致Perl拆分空格上的每一行输入,并将字段存储在@F
变量中$something ||= []
相当于$something = $something || []
;即,如果&amp ;,它将[]
(对空数组的引用)赋给变量$something
。仅当$something
已经为假或未定义时。$h{@F}
是哈希%h
的元素。因为此表达式以$
(而不是@
)开头,所以下标@F
在标量上下文中进行计算,并且数组的标量上下文使数组计算其长度。由于Perl代码只在行1 2 3 4
上执行,该行被分为四个元素,@F
只有四个元素长,因此$h{@F}
等同于$h{4}
(或者,技术上,$h{"4"}
)。因此,[]
将分配给$h{"4"}
,而4
是现有哈希%h
的唯一元素,keys %h
将返回仅包含"4"
的列表,并打印此列表的元素将打印4
。