Вообще говоря, лексические переменные могут употребляться в любом блоке, не только в пользовательских функциях. Например, их можно определять в блоках 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 для скаляров, пустой список для массивов.