在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