在 Perl 中,_
名称可以指代许多不同的变量:
常见的有:
$_ the default scalar (set by foreach, map, grep)
@_ the default array (set by calling a subroutine)
不太常见的:
%_ the default hash (not used by anything by default)
_ the default file handle (used by file test operators)
&_ an unused subroutine name
*_ the glob containing all of the above names
这些变量中的每一个都可以独立于其他变量使用。事实上,它们相关的唯一方式是它们都包含在*_
glob 中。
由于 sigils 随数组和散列而变化,因此在访问元素时,您可以使用括号字符来确定您正在访问的变量:
$_[0] # element of @_
$_{...} # element of %_
$$_[0] # first element of the array reference stored in $_
$_->[0] # same
for
/循环可以接受要使用的foreach
变量名而不是$_
,这在您的情况下可能更清楚:
for my $result (@results) {...}
通常,如果您的代码超过几行或嵌套,您应该命名变量而不是依赖默认变量。
由于您的问题更多地与变量名相关而不是范围,因此我没有讨论围绕 foreach 循环的实际范围,但总的来说,以下代码与您所拥有的代码等价。
for (my $i = 0; $i < $#results; $i++) {
local *_ = \$results[$i];
...
}
该行将第 th 个元素local *_ = \$results[$i]
安装到glob的标量槽中,即. 此时包含数组元素的别名。本地化将在循环结束时展开。 创建一个动态范围,因此从循环内调用的任何子例程都将看到新值 of ,除非它们也将其本地化。有关这些概念的更多详细信息,但我认为它们超出了您的问题范围。$i
@results
*_
$_
$_
local
$_