我刚给了一个代码段:
@list = grep { !$_{$_}++ } @list;
作为重复数据删除的习惯用语。它似乎有用,但是 - %_
中没有列出perlvar
。
我通常会通过声明%seen
例如:
my %seen; my @list = grep { not $seen{$_}++ } @list;
但%_
似乎有效,尽管它似乎是全球范围的。谁能指点我参考呢? (或者至少向我保证,做上述事情并不会破坏重要的事情!)
答案 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 %_
(正如您所做的那样)会产生非常深远的影响。