@arr
- глобальная переменная, созданная, когда она впервые встречается парсером, а затем отображается во всем пакете.
use warnings;
#use strict;
for (1..3) {
#my @arr;
for (1..3) {
push @arr, $_;
}
}
print "@arr\n";
Он печатает
1 2 3 1 2 3 1 2 3
Это одна из плохих вещей о глобалов, что они «излучают» по всему коду.
С use strict;
позволило нам получить
Possible unintended interpolation of @arr in string at scope.pl line 11.
Global symbol "@arr" requires explicit package name at scope.pl line 7.
Global symbol "@arr" requires explicit package name at scope.pl line 11.
Execution of scope.pl aborted due to compilation errors.
Поскольку strict
просто навязывает заявления, это осмысленно сообщает нам, что @arr
является глобальным (таким образом, увидеть повсюду в коде).
Объявление этого объекта сверху должно иметь такой же эффект, но это не то же самое, что необъявленная глобальная переменная. Переменная my
является лексической и имеет область действия, ближайший закрывающий блок. От my
my
объявляет перечисленные переменные локальными (лексически) в вшита блок, файл или eval
. Если указано более одной переменной, список должен быть помещен в круглые скобки.
Кроме того, лексика не находится в таблице символов.
Поэтому, когда он объявлен внутри первого цикла (прокомментированная строка), он не отображается в конце (он не существует вне блока этого цикла). Последняя строка ссылается на глобальный @arr
, созданный там, который никогда не был назначен. Мы получили предупреждение
Possible unintended interpolation of @arr in string at scope.pl line 11.
Name "main::arr" used only once: possible typo at scope.pl line 11.
о пустом main::arr
используется один раз, и пустая строка, так как он будет напечатан.
Смотрите также Private variables via my()
in perlsub
«* создается при первом использовании *» - технически анализатор создает его, когда он впервые увидел, не обязательно используется (например, 'если (0) {печать @arr;}' будет создайте '@main :: arr' во время компиляции (предполагая' no strict')). – melpomene
@melpomene Хорошая точка, и я только что решил изменить это (делая еще одно небольшое редактирование)! Дело в том, что меня задавали вопросы об использовании «_seen_» (ссылаясь на компиляторы «видя» символы, которые, как я думал, были абсолютно ясны) ... изменили его сейчас, спасибо :) – zdim