Приватные переменные в пользовательских функциях

Но если Perl создает новую копию @_ для каждого вызова функции, не может ли он также создать переменные, которые будут использоваться только внутри этой функции? Конечно, может. По умолчанию все переменные в Perl являются глобальными; иначе говоря, они доступны из любой точки программы. Но вы также можете в любой момент создать приватные переменные, называемые лексическими переменными, при помощи оператора my:

sub max {
my($m, $n); # Новые, приватные переменные для этого блока
($m, $n) = @_; # Присваивание имен параметрам
if ($m > $n) { $m } else { $n }
}

Область видимости этих переменных ограничивается блоком, в котором они находятся; все внешние переменные с именами $m или $n совершенно не зависят от них. Независимость работает в обе стороны: внешний код не может обращаться к приватным переменным и изменять их, случайно или намеренно. Таким образом, вы можете вставить эту функцию в любую программу Perl и применять ее, зная, что она не повредит переменные $m и $n этой программы (если они используются). Стоит также заметить, что внутри блоков if точка с запятой после выражения, определяющего возвращаемое значение, не обязательна.


Хотя Perl позволяет опустить последний символ ; в блоке, на практике это стоит делать только в очень простом коде, когда весь блок записывается в одну строку.

Код предыдущего примера можно сделать еще проще. Вы заметили, что список ($m, $n) встречается дважды? Оператор my также можно применить к списку переменных в круглых скобках, поэтому в пользовательских функциях эти две начальные команды часто объединяются:

my($m, $n) = @_; # Присваивание имен параметрам

Эта команда создает приватные переменные и одновременно инициализирует их, так что первому параметру теперь присвоено более удобное имя $m, а второму – $n. Почти каждая пользовательская функция начинается с подобной строки. Она четко показывает, что функция должна получать два скалярных параметра, которым внутри функции присваиваются имена $m и $n.

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

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

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