“什么是%_&引用;用perl?

“什么是%_&引用;用perl?,perl,Perl,我刚刚收到一段代码片段: @list = grep { !$_{$_}++ } @list; 作为重复数据消除的习惯用法。它似乎可以工作,但是-在perlvar中没有列出%\ucode> 我通常会通过声明%seed来写上述内容,例如: my %seen; my @list = grep { not $seen{$_}++ } @list; 但是,%\uu似乎有效,尽管它似乎是全局范围的。有人能给我指一份推荐信吗?(或者至少让我放心,做上述事情并不是破坏重要的东西!)这是一个杂凑。您可以使用名

我刚刚收到一段代码片段:

@list = grep { !$_{$_}++ } @list;
作为重复数据消除的习惯用法。它似乎可以工作,但是-在
perlvar
中没有列出
%\ucode>

我通常会通过声明
%seed
来写上述内容,例如:

my %seen; my @list = grep { not $seen{$_}++ } @list;

但是,
%\uu
似乎有效,尽管它似乎是全局范围的。有人能给我指一份推荐信吗?(或者至少让我放心,做上述事情并不是破坏重要的东西!)

这是一个杂凑。您可以使用名为
\uu
的哈希,因为
\u
是变量的有效名称。(我相信您熟悉
$和
@

当前没有任何Perl内置项对其进行设置或隐式读取
%\uucode>,但保留了
%\ucode>等标点变量

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


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

$ 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!
$perl-E'
%::x=(名称=>“%::x”);
%:::(名称=>“%::”);
%Foo::x=(名称=>%Foo::x”);
%Foo::(name=>%Foo::);
包装食品;
说“%::x=$::x{name}”;
说“%::$::{name}”;
说“%Foo::x=$Foo::x{name}”;
说“%Foo::\=$Foo::{name}”;
说“%x=$x{name}”;
说“%\=$\{name}”;
'
%::x=%::x
%::_    = %::_
%Foo::x=%Foo::x
%Foo::\uu=%Foo::_
%x=%Foo::x

%_=%:u这里有一些关于它的讨论:有趣。那么,它可能像
\uu
typeglob的剩菜一样简单吗?我想知道是否还有比15年前更近的东西。(但我想如果它没有改变,就没有理由了)。这并不是说你需要一个
local%\,原因与您看到的
my%相同perl-E'{local%\uuu;say grep{${$}++}qw/a b c c d d E f g/;say%\u}say%\ucode>的东西,
local
避免了全局作用域的“污染”@g.Cito,变量仍然是全局可见的,但它的值将在作用域退出时恢复。(我之前的评论应该是“注意,你需要……”)