2017-02-15 15 views

ответ

8

@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

«* создается при первом использовании *» - технически анализатор создает его, когда он впервые увидел, не обязательно используется (например, 'если (0) {печать @arr;}' будет создайте '@main :: arr' во время компиляции (предполагая' no strict')). – melpomene

+0

@melpomene Хорошая точка, и я только что решил изменить это (делая еще одно небольшое редактирование)! Дело в том, что меня задавали вопросы об использовании «_seen_» (ссылаясь на компиляторы «видя» символы, которые, как я думал, были абсолютно ясны) ... изменили его сейчас, спасибо :) – zdim

 Смежные вопросы

  • Нет связанных вопросов^_^