perl中的匿名哈希

时间:2014-03-10 23:28:15

标签: perl

我开始学习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} ||= [] ..)

1 个答案:

答案 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