Сегодня я наткнулся на что-то в Perl, о котором я не знал: он «локализует» переменную, которой присвоены элементы перечисленного списка.Почему Perl не требует, чтобы переменная была объявлена с моим?
Это, конечно же, задокументировано в документации 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
.
Насколько я могу сказать, что нет никакой разницы, если бы я добавил my
к $g
в петле Еогеасп:
foreach my $g (1..5) {
На самом деле, я в конечном итоге делает это, потому что я чувствую, что делает его более ясным, что переменная является локальным для цикла.
Мой вопрос сейчас: есть ли сценарий, в котором мое использование my
действительно имеет значение (учитывая, что $g
уже объявлен глобально).
Для foreach не требуется мое объявление, если вы его объявили глобально. Странно, однако, что он не будет жаловаться, что вы объявляете это снова. Например, если вы удалите диапазон, он будет жаловаться на то, что вы уже объявили '$ g', я пойду и немного изучу это. –
Если переменная была ранее объявлена с помощью my, она использует эту переменную вместо глобальной, но она все еще локализована в цикле. Эта * неявная локализация происходит только в цикле foreach *. http://perldoc.perl.org/perlsyn.html#Foreach-Loops – user3606329
@ user3606329 Это правильно, но если вы возьмете этот код и удалите диапазон, он создаст ошибку. Переменная еще не находится внутри цикла, она является частью инструкции foreach. –