在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中。
由于印记与数组和散列变化,访问一个元素时,可以使用括号字符,以确定要访问哪个变量:
$_[0] # element of @_
$_{...} # element of %_
$$_[0] # first element of the array reference stored in $_
$_->[0] # same
的for
/foreach
环可以接受一个变量名使用而不是$_
,这可能是在您的情况更清楚:
for my $result (@results) {...}
一般情况下,如果你的代码的长度超过了几行,或嵌套,你应该命名变量,而TH依靠默认的。
由于您的问题涉及多个比范围变量名,我还没有讨论围绕foreach循环的实际范围,但在一般情况下,下面的代码就相当于你有什么。
for (my $i = 0; $i < $#results; $i++) {
local *_ = \$results[$i];
...
}
线local *_ = \$results[$i]
安装的@results
$i
的第i个元素到*_
水珠,又名$_
的标时隙。此时$_
包含数组元素的别名。本地化将在循环结束时放松。 local
创建一个动态范围,因此在循环内调用的任何子例程将看到新值$_
,除非它们也将其本地化。关于这些概念还有更多可用的细节,但我认为它们超出了你的问题的范围。
一般的经验法则是永远不会使用默认标量,除非绝对必要。 'foreach(@results)'与foreach(@results)相比''foreach $ result(@results)'从代码可维护性/可读性来说更好。仅仅因为Perl对字符类型和可读性的折衷非常宽容,并不意味着你不应该总是在可读性方面犯错。总是编码,就好像下一个开发人员维护你的代码是一个狂热的精神病患者,他知道你住在哪里:) – DVK
实际上,这个问题不是'$ _'的范围,它是由于误解Perl命名约定而导致的。 – Wolf