Но если 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.