什么是"%_"在perl?

时间:2015-09-29 14:34:49

标签: perl

我刚给了一个代码段:

@list = grep { !$_{$_}++ } @list;

作为重复数据删除的习惯用语。它似乎有用,但是 - %_中没有列出perlvar

我通常会通过声明%seen例如:

来写上述内容。
my %seen; my @list = grep { not $seen{$_}++ } @list;

%_似乎有效,尽管它似乎是全球范围的。谁能指点我参考呢? (或者至少向我保证,做上述事情并不会破坏重要的事情!)

1 个答案:

答案 0 :(得分:23)

这是一个哈希。您可以使用名为_的哈希,因为_是变量的有效名称。 (我确信您熟悉$_@_。)

没有Perl内置程序当前设置它或隐式读取%_,但保留标点变量,如%_

  

Perl变量名也可以是数字序列或单个标点符号或控制字符(不推荐使用文字控制字符形式)。这些名称都保留给Perl的特殊用途

请注意,标点符号变量也很特殊,因为它们是“超级全局变量”。这意味着不合格的%_引用根包中的%_,而不是当前包中的%_

$ perl -E'
   %::x    = ( name => "%::x"    );
   %::_    = ( name => "%::_"    );
   %Foo::x = ( name => "%Foo::x" );
   %Foo::_ = ( name => "%Foo::_" );

   package Foo;

   say "%::x    = $::x{name}";
   say "%::_    = $::_{name}";
   say "%Foo::x = $Foo::x{name}";
   say "%Foo::_ = $Foo::_{name}";

   say "%x      = $x{name}";
   say "%_      = $_{name}";
'
%::x    = %::x
%::_    = %::_
%Foo::x = %Foo::x
%Foo::_ = %Foo::_
%x      = %Foo::x
%_      = %::_      <-- surprise!

这意味着忘记使用local %_(正如您所做的那样)会产生非常深远的影响。