perl中的"%_"是什么?

Sob*_*que 28 perl

我刚给了一个代码片段:

@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 %_(如你所做)可能会产生非常深远的影响.