加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

未记录的Perl变量%_?

发布时间:2020-12-15 21:21:26 所属栏目:大数据 来源:网络整理
导读:我最近发现在Perl,%_中似乎是一个未记录的变量。我不记得我是怎么偶然发现的(这是上个星期),但是我在我的代码中打错了我使用的地图,而不是$ _- {key}我使用$ _ {key}。当我发现错误时,我感到惊讶的是它没有产生错误,并且我确认使用严格且使用警告已到
我最近发现在Perl,%_中似乎是一个未记录的变量。我不记得我是怎么偶然发现的(这是上个星期),但是我在我的代码中打错了我使用的地图,而不是$ _-> {key}我使用$ _ {key}。当我发现错误时,我感到惊讶的是它没有产生错误,并且我确认使用严格且使用警告已到位。

所以,我做了一个小小的测试,并确实运行没有任何警告或错误:

$ perl
use strict;
use warnings;
print keys %_;
$

所以,我可以想象的是,%_被定义在某个地方。我在perlvar找不到,那是什么交易?它在上面的脚本中没有任何内容。

解决方法

标点变量不受严格限制。这就是为什么你不需要像我们的$ _之前使用$ _。从perlvar,

Perl identifiers that begin with digits,control characters,or punctuation characters […] are also exempt from strict 'vars' errors.

%_不是无证件的。从perlvar,

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

您可以有一个名为_的哈希,因为_是变量的有效名称。 (我相信你熟悉$ _和@_。)

没有Perl内置当前设置它或读取%_ implicitly,但标点符号变量如%_保留。

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

$ perl -E'
   %::x    = ( "%::x"    => 1 );
   %::_    = ( "%::_"    => 1 );
   %Foo::x = ( "%Foo::x" => 1 );
   %Foo::_ = ( "%Foo::_" => 1 );

   package Foo;
   say "%x      = ",keys(%x);
   say "%_      = ",keys(%_);
   say "%::x    = ",keys(%::x);
   say "%::_    = ",keys(%::_);
   say "%Foo::x = ",keys(%Foo::x);
   say "%Foo::_ = ",keys(%Foo::_);
'
%x      = %Foo::x
%_      = %::_      <-- surprise!
%::x    = %::x
%::_    = %::_
%Foo::x = %Foo::x
%Foo::_ = %Foo::_

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读