今天,我偶然發現了Perl中的某些東西,我並不知道它:「本地化」了列表元素被分配到的變量。爲什麼Perl的foreach不需要用我的變量聲明呢?
這當然是在Perl文檔中記錄的 - 但是我沒有記住或閱讀它。
以下腳本演示了我的意思:
use warnings;
use strict;
my $g = 99;
foreach $g (1..5) {
p($g);
}
sub p {
my $l = shift;
printf ("%2d %2d\n", $g, $l);
}
腳本打印
99 1
99 2
99 3
99 4
99 5
因爲$g
是 「本地化」 的foreach
循環。
至於我可以告訴沒有區別,如果我在foreach循環中添加my
到$g
:
foreach my $g (1..5) {
其實,我落得這樣做,因爲我覺得它使更清晰的變量是循環的本地。
我現在的問題是:是否有一種情況,我使用my
確實有所作爲(因爲$g
已被全球聲明)。
如果您在全球範圍內聲明瞭該foreach,則不需要我的聲明。然而,它不會抱怨你再次宣佈它是奇怪的。例如,如果你刪除範圍,它會抱怨你已經聲明'$ g'我會去研究一下。 – 2017-02-15 08:27:23
如果變量先前是用my聲明的,它將使用該變量而不是全局變量,但它仍然是本地化的。這種*隱式本地化只發生在foreach循環*中。 http://perldoc.perl.org/perlsyn.html#Foreach-Loops – user3606329
@ user3606329這是正確的,但如果你拿這個代碼並刪除範圍它將會產生一個錯誤。該變量還不在循環內部,它是foreach語句的一部分。 – 2017-02-15 08:43:45