Dzisiaj natknąłem się na coś w Perlu, którego nie znałem: "lokalizuje" zmienną, do której przypisane są elementy z listy iterowanej.Dlaczego foreach Perla nie wymaga deklarowania swojej zmiennej za pomocą mojego?
To oczywiście jest udokumentowane w dokumentacji Perla - jednak nie udało mi się go zapamiętać ani przeczytać.
Poniższy skrypt pokazuje, co to znaczy:
use warnings;
use strict;
my $g = 99;
foreach $g (1..5) {
p($g);
}
sub p {
my $l = shift;
printf ("%2d %2d\n", $g, $l);
}
drukuje skrypt
99 1
99 2
99 3
99 4
99 5
ponieważ $g
jest "miejscowe" do pętli foreach
.
O ile mogę powiedzieć, nie ma żadnej różnicy, gdybym dodał my
do $g
w pętli foreach:
foreach my $g (1..5) {
Faktycznie, skończyło się to robi, bo czuję, że czyni go bardziej zrozumiałym, że zmienna jest lokalny w pętli.
Moje pytanie brzmi teraz: czy istnieje scenariusz, w którym moje użycie my
ma znaczenie (biorąc pod uwagę, że $g
jest już zadeklarowane globalnie).
Foreach nie wymaga mojej deklaracji, jeśli została zgłoszona na całym świecie. Dziwne jest jednak, że nie będzie narzekać, że deklarujesz to ponownie. Na przykład, jeśli usuniesz zasięg, zarzuci on, że już zadeklarowałeś '$ g', że pójdę i trochę to zbadam. –
Jeśli zmienna została wcześniej zadeklarowana za pomocą my, używa tej zmiennej zamiast globalnej, ale nadal jest zlokalizowana w pętli. Ta * niejawna lokalizacja występuje tylko w pętli foreach *. http://perldoc.perl.org/perlsyn.html#Foreach-Loops – user3606329
@ user3606329 To prawda, ale jeśli weźmiesz ten kod i usuniesz zakres, spowoduje to błąd. Zmienna nie jest jeszcze w pętli, jest częścią instrukcji foreach. –