Языки

» Html
» Java Script

» PHP

» Perl

» ASP

» CGI

» Xml

» Dhtml

» VBScript

» Java

» Css

Уроки

» Photoshop

» Corel Draw

» Dreamwawer

» Flash MX

Скачать

» Программы

» Книги

Шаблоны

» Сайтов

» Flash

» Скрипты

Perl

 

» язык perl

     » Главная страница

     » Вернуться к содержанию ( Perl )

 

Подпрограммы

Для применения подпрограммы ее необходимо определить либо в текущем модуле (файле), либо во внешнем модуле (файле). Подпрограммы определяются и декларируются следующим образом:

¦  sub имя; — Только декларация.

¦  sub имя (прототипы); — То же но с декларацией параметров.

¦  sub имя блок; — Декларация и определение.

¦  sub имя (прототипы) блок; — То же, но с параметрами.

Для определения динамической анонимной подпрограммы можно указать:

$переменная = sub блок;

Для импортирования подпрограмм из других модулей используйте:

use модуль qw(подпрограмма1 подпрограмма2 );

Вызов подпрограммы:

имя(список параметров); # символ '&' можно не указывать.

имя список; # Если подпрограмма уже декларирована.

&имя; # Параметры в @_

Все параметры передаются подпрограмме как массив @_. Соответственно $_[0] — первый параметр, $_[1] — второй. Массив @_ — локальный, но он содержит адреса параметров, поэтому можно изменять значение параметров. Возвращаемое значение подпрограммы — результат последнего оператора. Это может быть как скаляр так и массив. Можно принудительно возвращать результат используя функцию return().

Подпрограмму можно вызвать, используя префикс & перед именем подпрограммы. Если подпрограмма предварительно продекларирована, то префикс и скобки можно опустить.

Private переменные

Для применения переменных доступных только внутри блока или подпрограммы необходимо определить их с помощью функции my(список).

Если переменная одна, то скобки можно опустить.

my() декларирует private переменные в пределах текущей подпрограммы, блока, функции eval() или do/require/use файлов. Private переменные аналогичны auto переменным в С.

Пример:

# Программа вычисления факториала.

print fact(3); # вычислить факториал 3*2*1

sub fact # Определяем подпрограмму.

{ my $m; # private переменная но не local !

$m = $_[0];

return 1 if $m <= 1; return($m * fact($m 1)); }

Можно указывать начальные значения private переменных как:

my(список) = выражение;

Так для вышеприведенного примера лучше было написать:

my($m) = $_[0];

Переменные типа local

В общем лучше использовать private переменные, т. к. это надежней и быстрее. private переменные обеспечивают лексическую область применения (видимости), а local — динамическую. Обычно это переменные форматов, значение которых должно быть видимо из вызываемых подпрограмм. Применение функции local() нецелесообразно в циклах, так как она вызывается каждый раз и таким образом заметно увеличивает время выполнения цикла.

Прототипы (prototypes)

Для краткого описания типа передаваемых подпрограмме параметров можно применять прототипы. В Perl существуют следующие прототипы:

Декларация Пример вызова

sub mylink($$) mylink $old, $new

sub myvec($$$) myvec $var, $offset, 1

sub myindex($$;$) myindex &getstring, "substr"

sub myreverse(@) myreverse $a, $b, $c

sub myjoin($@) myjoin ":",$a,$b,$c

sub mypop(\ @) mypop @array

sub mysplice(\ @$$@) mysplice @array, @array, 0, @pushme

sub mykeys(\ %) mykeys %{ $hashref}

sub myopen(*;$) myopen HANDLE, $name

sub mypipe(**) mypipe READHANDLE, WRITEHANDLE

sub mygrep(&@) mygrep { /foo/ } $a, $b, $c

sub myrand($) myrand 42

sub mytime() mytime

Здесь:

¦  \ 'символ' — параметр с типом 'символ'

¦  @ или % — все оставшиеся параметры как список

¦  $ — скаляр

¦  & — безымянная подпрограмма

¦  * — ссылка на таблицу имен

¦  ; — разграничитель обязательных и не обязательных параметров.

Ссылка как параметр

Иногда нужно в качестве параметра передать подпрограмме не значение элемента массива, а ссылку на него, чтобы подпрограмма могла изменить значение элемента. Для этого в Perl к имени переменной добавляется символ “*”. Подобное выражение называют type glob так же как в Unix символом “*” обозначают “все возможные значения”. Поэтому “*” для массива означает “все элементы массива”. Для скаляров употреблять “*” не имеет смысла, так как они и так передаются ссылкой и вы можете изменять значение параметра, изменяя, например, переменную $_[0].

Переопределение встроенных функций

Большинство встроенных функций Perl можно переопределить своими собственными. Обычно это делают для удобства совместимости Perl для разных платформ систем.

Для этого нужно перечислить имена этих функций в виде:

use subs 'функция1', 'функция2' ....;

и далее в модуле определить сами функции.

Автозагрузка

Если вы попытаетесь вызвать несуществующую функцию, то Perl немедленно выдаст сообщение об ошибке. Но если вы определите подпрограмму с именем AUTOLOAD, то она будет вызвана с теми же параметрами, а переменная $AUTOLOAD будет содержать имя несуществующей подпрограммы. Данный механизм очень удобен для средств отладки.

Сохранить документ

Сохранить документ (.doc)

Распечатать документ

Напечатать

 

Следующий урок

 


Общение
» Чат

» Форум

Реклама 

Здесь может быть Ваша реклама

Поиск

» Поиск

Статистика 

Связь
» Web дизайнер

» Ваша реклама

» Отзывы

» О проекте



Сайт управляется системой uCoz