6

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

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

my $_;对传递给say的参数进行词汇化是否有效?

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

4

1 回答 1

10

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

perldoc perldelta(5.10.0)

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

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

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

而且,perldoc perl591delta它继续说:

词汇 $_

默认变量$_现在可以被词法化,通过像任何其他词法变量一样声明它,使用一个简单的

     my $_;

默认开启的操作$_将使用其存在时的词法范围版本$_,而不是全局$_.

在 " map" 或 " grep" 块中,如果$_之前是my'ed,则$_块内部也是词法的(并且作用域为块)。

$_已经词法化的作用域中,您仍然可以$_通过 using访问全局版本$::_,或者更简单地说,通过使用 " " 覆盖词法声明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;
于 2010-08-03T01:47:32.133 回答