Подпрограммы Perl также являются определяемыми пользователем функциями.
Подпрограмма Perl — это отдельный фрагмент кода, выполняющий определенную задачу, что может уменьшить количество повторяющегося кода и облегчить чтение программы.
Подпрограммы Perl могут появляться в любом месте программы, их синтаксический формат следующий:
подпрограмма {операторы;}
Формат синтаксиса вызова подпрограммы:
подпрограмма (список параметров);
В версиях Perl ниже 5.0 метод вызова подпрограммы следующий:
&подпрограмма(список параметров);
В новой версии хотя и поддерживается этот метод вызова, его использование не рекомендуется.
Далее давайте рассмотрим простой пример:
Выполняя вышеуказанную программу, результат вывода:
Привет, мир!
Подпрограммы Perl могут принимать несколько параметров, так как другие параметры подпрограмм отмечены специальным массивом @_.
Следовательно, первый параметр подпрограммы — $_[0], второй параметр — $_[1] и так далее.
Независимо от того, являются ли параметры скалярными или массивными, когда пользователь передает параметры подпрограмме, Perl по умолчанию вызывает их по ссылке.
Выполняя вышеуказанную программу, результат вывода:
Переданные параметры: 10 20 30 Значение первого параметра: 10 Среднее значение переданных параметров: 20
Пользователи могут изменить значение соответствующего фактического параметра, изменив значение в массиве @_.
Поскольку переменная @_ представляет собой массив, в подпрограмму можно передать список.
Но если нам нужно передать скалярные параметры и параметры массива, нам нужно поместить список в последний параметр, как показано ниже:
Приведенная выше программа объединяет скаляры и массивы, и результат:
Список: 10 1 2 3 4
Мы можем передать в подпрограмму несколько массивов и хешей, но при передаче нескольких массивов и хешей независимые идентификаторы будут потеряны. Поэтому для прохождения нам нужно использовать ссылки (которые будут представлены в следующей главе).
Когда хэш-таблица передается подпрограмме, она копируется в @_, и хеш-таблица расширяется до списка комбинаций ключ/значение.
Выходной результат выполнения вышеуказанной программы:
возраст: 3имя: codercto
Подпрограммы могут возвращать значения функций с помощью оператора return, как и в других языках программирования.
Если оператор возврата не используется, в качестве возвращаемого значения используется последняя строка подпрограммы.
Выходной результат выполнения вышеуказанной программы:
3
Мы можем возвращать скаляры, массивы и хеши в подпрограммах, но при возврате нескольких массивов и хешей независимые идентификаторы будут потеряны. Поэтому нам нужно использовать ссылки (представленные в следующей главе) для возврата нескольких массивов и функций.
По умолчанию все переменные в Perl являются глобальными переменными, а это означает, что переменные можно вызывать в любом месте программы.
Если нам нужно установить частную переменную, мы можем использовать для ее установки оператор my .
Оператор my используется для создания переменных с лексической областью действия. Переменные, созданные с помощью my, сохраняются от начала объявления до конца закрытой области.
Закрытая область — это область внутри пары фигурных скобок, файла или строки if, while, for, foreach или eval.
В следующем примере показано, как объявить одну или несколько частных переменных:
sub somefunc { my $variable; # $variable не отображается вне метода somefunc() my ($another, @an_array, %a_hash # Объявляем несколько переменных одновременно}
Выходной результат выполнения вышеуказанной программы:
Строка внутри функции: Привет, Codercto Строка вне функции: Привет, Мир!
Мы можем использовать local для предоставления временных значений глобальным переменным и возврата исходных значений после выхода из области видимости.
Переменные, определенные local, не существуют в основной программе, но существуют в подпрограмме и подпрограммах, вызываемых подпрограммой. Вы можете присвоить ему значение при его определении, например:
Выходной результат выполнения вышеуказанной программы:
Строковое значение внутри функции PrintMe: Hello, Codercto!PrintCodercto Строковое значение внутри функции: Hello, Codercto!PrintHello Строковое значение внутри функции: Hello, World! Строковое значение вне функции: Hello, World!
Функция оператора состояния аналогична модификатору static в C. Ключевое слово state делает локальные переменные постоянными.
Состояние также является лексической переменной, поэтому оно допустимо только в той лексической области, в которой определена переменная. Например:
Выходной результат выполнения вышеуказанной программы:
Значение счетчика: 0 счетчик Значение: 1 счетчик Значение: 2 счетчик Значение: 3 счетчик Значение: 4
Примечание 1: состояние может создавать только переменные, закрытая область действия которых находится внутри подпрограммы.
Примечание 2: состояние было введено в Perl 5.9.4, поэтому использование необходимо добавить перед использованием.
Примечание 3: состояние может объявлять скаляры, массивы и хэши. Но массивы и хэши не могут быть инициализированы при их объявлении (по крайней мере, в Perl 5.14).
В процессе вызова подпрограммы будут возвращены разные типы значений в зависимости от контекста. Например, следующая подпрограмма localtime() возвращает строку в скалярном контексте и список в списковом контексте:
Выходной результат выполнения вышеуказанной программы:
Вс 12 июня 15:58:09 20162106-6-12 15:58:9