В Perl область видимости переменных определяется ключевыми словами my и local.
my создаёт переменную с лексической областью видимости (действует только в текущем блоке).local временно сохраняет текущее значение глобальной переменной и устанавливает новое на время существования блока — зачастую используется только с глобальными переменными (например, $_, $/ и др.).Пример:
my $x = 42; # видно только в текущем блоке { local $/ = undef; my $input = <STDIN>; # $/ здесь undef, после блока — восстановит значение }
Использовать my предпочтительнее из-за более предсказуемой области видимости.
Что произойдёт при использовании my и local с одной и той же переменной, объявленной в двух разных блоках?
Часто отвечают, что
localиmyработают одинаково, но это не так.localработает только с глобальными переменными (package variables). Переменная, объявленная с помощьюmy, невидима дляlocal.
Пример:
our $foo = "global"; { local $foo = "local"; print $foo; # "local" } print $foo; # "global" { my $foo = "lexical"; } # $foo вне блока — глобальный вариант, не "lexical"
История
В скрипте использовали local для временной подмены переменной, объявленной через my, что не приводило ни к какому результату и вызывало баги в обработке событий в одном из внутренних модулей.
История
В проекте "локализовали" $_ через local внутри foreach, ожидая подмены $_ для итераторов, забывая что foreach уже задаёт новую $_. Итог — неработающий фильтр и неверная логика перебора.
История
Глобальная переменная пакета не была объявлена через our, и попытка локализации через local $var приводила к падению скрипта из-за strict и warning, а отладка заняла сутки.