我刚刚得到一个代码片段:
@list = grep { !$_{$_}++ } @list;
作为重复数据删除的习语。它似乎工作,但 – 没有%_列出perlvar。
我通常是写上面的声明%看到例如:
my %seen; my @list = grep { not $seen{$_}++ } @list;
但%_似乎工作,虽然它似乎是全球范围。任何人都可以指点我的参考吗? (或至少再次保证我,做上述是不是粉碎的东西重要!)
解决方法
这是一个哈希。您可以有一个名为_的哈希,因为_是变量的有效名称。 (我相信你熟悉$ _和@_。)
没有Perl内置当前设置它或读取%_ implicitly,但标点符号变量如%_保留。
Perl variable names may also be a sequence of digits or a single punctuation or control character (with the literal control character form deprecated). These names are all reserved for special uses by 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!
这意味着忘记使用本地%_(如你所做)可以产生非常深远的影响。