gpt4 book ai didi

perl - perl 中的 "%_"是什么?

转载 作者:行者123 更新时间:2023-12-03 10:04:05 25 4
gpt4 key购买 nike

我刚刚得到了一个代码片段:

@list = grep { !$_{$_}++ } @list;

作为重复数据删除的惯用语。它似乎有效,但是 - 没有 %_列于 perlvar .

我通常会通过声明 %seen 来写上面的内容例如。:
my %seen; my @list = grep { not $seen{$_}++ } @list;

但是 %_似乎工作,虽然它似乎是全局范围。任何人都可以指出我的引用吗? (或者至少让我放心,执行上述操作不会破坏重要的事情!)

最佳答案

这是一个哈希。你可以有一个名为 _ 的哈希值因为 _是变量的有效名称。 (我确定您熟悉 $_@_ 。)

当前没有 Perl 内置程序设置或读取 %_隐式,但标点变量,例如 %_被保留。

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



请注意,标点变量也很特殊,因为它们是“ super 全局变量”。这意味着不合格 %_%_在根包中,而不是 %_在当前包中。
$ 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!

这意味着忘记使用 local %_ (正如您所做的)可以产生非常深远的影响。

关于perl - perl 中的 "%_"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32846792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com