我认为答案是肯定的,但我只是想确定一下。所以,如果我有
sub something {
my $_;
my @array = ...;
while ( @array ) {
say;
}
}
是my $_;
实际上有效地将传递给say?
在这种特殊情况下,我正在使用DZP::UnusedVarsTests而且它抱怨我没有使用my $_;
,我怀疑这是一个错误,因为我在隐含的情况下使用它。
答案 0 :(得分:10)
简短的回答是肯定的。它使该范围内的函数使用词法范围$_
,而不是全局$_
。如果他们回复$_
,就像s///
一样,您将获得一定程度的损害控制。
“
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;