Это старый вопрос, но я когда-либо встречал некоторые подводные камни в лексических объявлениях в Perl, которые меня расстроили, которые также связаны с этим вопросом, поэтому я просто добавлю свое резюме здесь:
1. определение или декларация?
local $var = 42;
print "var: $var\n";
Выход составляет var: 42
. Однако мы не могли сказать, является ли local $var = 42;
определением или объявлением. Но как насчет этого:
use strict;
use warnings;
local $var = 42;
print "var: $var\n";
Вторая программа выдаст ошибку:
Global symbol "$var" requires explicit package name.
$var
не определено, что означает, что local $var;
это просто объявление! Прежде чем использовать local
для объявления переменной, убедитесь, что она ранее определена как глобальная переменная.
Но почему это не подведет?
use strict;
use warnings;
local $a = 42;
print "var: $a\n";
Вывод: var: 42
.
Это потому, что $a
, как и $b
, является глобальной переменной, предопределенной в Perl. Помните функцию sort ?
2. лексический или глобальный?
Я был программистом C до того, как начал использовать Perl, поэтому концепция лексических и глобальных переменных кажется мне простой: просто соответствует auto и внешним переменным в C. Но есть небольшие различия:
В C внешняя переменная - это переменная, определенная вне любого функционального блока. С другой стороны, автоматическая переменная - это переменная, определенная внутри функционального блока. Как это:
int global;
int main(void) {
int local;
}
Находясь в Perl, все тонко:
sub main {
$var = 42;
}
&main;
print "var: $var\n";
Вывод var: 42
, $var
- глобальная переменная, даже если она определена в функциональном блоке! На самом деле в Perl любая переменная объявляется как глобальная по умолчанию.
Урок состоит в том, чтобы всегда добавлять use strict; use warnings;
в начале программы на Perl, что заставит программиста явно объявлять лексическую переменную, чтобы мы не ошиблись из-за некоторых ошибок, принимаемых как должное.