“什么是%_&引用;用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%\第一个代码片段中的code>,原因与您看到的my%相同因此,使用类似于perl-E'{local%\uuu;say grep{${$}++}qw/a b c c d d E f g/;say%\u}say%\ucode>的东西,local
避免了全局作用域的“污染”@g.Cito,变量仍然是全局可见的,但它的值将在作用域退出时恢复。(我之前的评论应该是“注意,你需要……”)