О лексических переменных (my)Вообще говоря, лексические переменные могут употребляться в любом блоке, не только в пользовательских функциях. Например, их можно определять в блоках if, while или foreach:foreach (1..10) { my($square) = $_ * $_; # Приватная переменная для этого цикла print "$_ squared is $square.\n"; } Переменная $square является приватной для охватывающего блока; в данном случае это блок цикла foreach. Если охватывающего блока нет, переменная является приватной для всего файла с исходным кодом. Пока ваши программы будут размещаться в одном файле, так что это несущественно. Но важно понимать, что область видимости имени лексической переменной ограничивается наименьшим охватывающим блоком или файлом. Весь код, который может обратиться к $square, подразумевая именно эту переменную, находится в соответствующей текстовой области видимости. Это обстоятельство значительно упрощает сопровождение – если $square примет неверное значение, причину следует искать в ограниченном блоке исходного кода. Опытные программисты знают (часто по собственному горькому опыту), что ограничение области видимости переменной страницей кода или даже несколькими строками кода заметно ускоряет циклы разработки и тестирования. my($num) = @_; # Списочный контекст, эквивалентно ($num) = @_; my $num = @_; # Скалярный контекст, эквивалентно $num = @_; В первом случае переменная $num получает первый параметр в списочном контексте присваивания; во втором она получает количество параметров в скалярном контексте. Любая из этих строк кода может соответствовать намерениям программиста; по внешнему виду строки это определить невозможно, поэтому Perl не сможет предупредить об ошибке контекста (конечно, обе строки не должны присутствовать в одной функции, поскольку в одной области видимости невозможно определить две одноименные лексические переменные; это всего лишь пример). При чтении подобного кода можно всегда определить контекст присваивания, прикинув, какой контекст использовался бы без ключевого слова my. Раз уж мы заговорили об использовании my() с круглыми скобками, стоит запомнить, что без круглых скобок my только объявляет одну лексическую переменную: my $fred, $barney; # ОШИБКА! $barney не объявляется my($fred, $barney); # Объявляются обе переменные Конечно, my можно использовать для создания приватных массивов: my @phone_number; Любая новая переменная изначально содержит «пустое» значение – undef для скаляров, пустой список для массивов. Статьи из раздела Perl на эту тему: ![]() ![]() ![]() ![]() ![]() Вернуться в раздел: Perl / 3. Пользовательские функции
|