我刚给了一个代码片段:
@list = grep { !$_{$_}++ } @list;
Run Code Online (Sandbox Code Playgroud)
作为重复数据删除的习惯用语.它似乎工作,但 - 没有%_列出perlvar.
我通常会通过声明%seen例如:
my %seen; my @list = grep { not $seen{$_}++ } @list;
Run Code Online (Sandbox Code Playgroud)
但%_似乎工作,虽然它似乎是全球范围.谁能指点我参考呢?(或者至少向我保证,做上述事情并不会破坏重要的东西!)
ike*_*ami 23
这是一个哈希.您可以使用名为hash的哈希,_因为它_是变量的有效名称.(我相信你很熟悉$_和@_.)
没有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!
Run Code Online (Sandbox Code Playgroud)
这意味着忘记使用local %_(如你所做)可能会产生非常深远的影响.
| 归档时间: |
|
| 查看次数: |
2144 次 |
| 最近记录: |