О лексических переменных (my)

Вообще говоря, лексические переменные могут употребляться в любом блоке, не только в пользовательских функциях. Например, их можно определять в блоках if, while или foreach:

foreach (1..10) {
my($square) = $_ * $_; # Приватная переменная для этого цикла
print "$_ squared is $square.\n";
}

Переменная $square является приватной для охватывающего блока; в данном случае это блок цикла foreach. Если охватывающего блока нет, переменная является приватной для всего файла с исходным кодом. Пока ваши программы будут размещаться в одном файле, так что это несущественно. Но важно понимать, что область видимости имени лексической переменной ограничивается наименьшим охватывающим блоком или файлом. Весь код, который может обратиться к $square, подразумевая именно эту переменную, находится в соответствующей текстовой области видимости. Это обстоятельство значительно упрощает сопровождение – если $square примет неверное значение, причину следует искать в ограниченном блоке исходного кода.

Опытные программисты знают (часто по собственному горькому опыту), что ограничение области видимости переменной страницей кода или даже несколькими строками кода заметно ускоряет циклы разработки и тестирования.


Обратите также внимание на то, что оператор my не изменяет контекст присваивания:

my($num) = @_; # Списочный контекст, эквивалентно ($num) = @_;
my $num = @_; # Скалярный контекст, эквивалентно $num = @_;

В первом случае переменная $num получает первый параметр в списочном контексте присваивания; во втором она получает количество параметров в скалярном контексте. Любая из этих строк кода может соответствовать намерениям программиста; по внешнему виду строки это определить невозможно, поэтому Perl не сможет предупредить об ошибке контекста (конечно, обе строки не должны присутствовать в одной функции, поскольку в одной области видимости невозможно определить две одноименные лексические переменные; это всего лишь пример). При чтении подобного кода можно всегда определить контекст присваивания, прикинув, какой контекст использовался бы без ключевого слова my.

Раз уж мы заговорили об использовании my() с круглыми скобками, стоит запомнить, что без круглых скобок my только объявляет одну лексическую переменную:

my $fred, $barney; # ОШИБКА! $barney не объявляется
my($fred, $barney); # Объявляются обе переменные

Конечно, my можно использовать для создания приватных массивов:

my @phone_number;

Любая новая переменная изначально содержит «пустое» значение – undef для скаляров, пустой список для массивов.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Аргументы
Возвращаемые значения
Вызов пользовательской функции
Вызов функции без &
Директива use strict

Вернуться в раздел: Perl / 3. Пользовательские функции