我的$ _;如果隐含$ _则做任何事情

时间:2010-08-03 01:37:43

标签: perl lexical-scope

我认为答案是肯定的,但我只是想确定一下。所以,如果我有

sub something {
    my $_;
    my @array = ...;
    while ( @array ) {
        say;
    }
}

my $_;实际上有效地将传递给say?

的参数词汇化

在这种特殊情况下,我正在使用DZP::UnusedVarsTests而且它抱怨我没有使用my $_;,我怀疑这是一个错误,因为我在隐含的情况下使用它。

1 个答案:

答案 0 :(得分:10)

简短的回答是肯定的。它使该范围内的函数使用词法范围$_,而不是全局$_。如果他们回复$_,就像s///一样,您将获得一定程度的损害控制。

perldoc perldelta (5.10.0)

  

List::Util::first”在词汇$_(通常由“my $_”或“given”隐式引入)存在时行为不当。为每次迭代设置的变量是包变量$_,而不是词法$_ [RT#67694]。

     

在提供将块作为第一个参数的函数的其他模块中可能会出现类似的问题,例如

foo { ... $_ ...} list

而且,perldoc perl591delta继续说:

  

Lexical $ _

     

默认变量$_现在可以通过声明来进行词汇化   任何其他词汇变量,带有   简单

     my $_;
     

$_上的默认操作将使用$_的词法范围版本,而不是全局$_

     

在“map”或“grep”区块中,如果先前$_my,则该区域内的$_为也是词汇(并且限定在块中)。

     

$_已被词汇化的范围内,您仍然可以使用$_访问$::_的全局版本,或者更简单地说,通过覆盖词法声明“our $_”。

实施例

我想提供一些使用此功能的原因的示例:

my $_ = 'BOOM!';

sub something {
    my $_;                         ## Try running with and without
    my @array = qw/foo bar baz/;
    while ( $_ = pop @array ) {
        say;
    }   
}   

something();

say;

另一个例子

my $_ = 'foo';

sub something {
  my $_ = $_;  ## Try running with and without
  s/foo/bar/;
  $_;
}

something();

say;