Создание серверных приложений на языке PERL

Для применения подпрограммы ее необходимо




Урок 17. Подпрограммы, прототипы

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

  • sub имя; - Только декларация. Определение ниже.


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


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


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


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

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

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

    Для тех кто еще не понял о чем идет речь:

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

    Процедурой в Perl называют особым образом оформленный участок кода со своим собственным именем. Упоминание этого имени в программе приводит к активации процедуры. Сразу после активации процедуры начинают выполняться входящие в неё операторы. После выполнения последнего оператора, основная программа продолжает свое выполнение дальше.

    Для обмена информацией между основной программой и процедурой используются параметры вызова. Для передачи информации от процедуры программе, внутри процедуры используется оператор return.

    Прототипы

    Для краткого описания типа передаваемых подпрограмме параметров можно применять прототипы. Если формат передаваемых данных не будет удовлетворять шаблону прототипа, это вызовет ошибку программы. В 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
    Здесь:

  • \'символ' - параметр с типом 'символ'


  • '@' или '%' - все оставшиеся параметры как список


  • '$' - скаляр


  • '&' - безымянная подпрограмма


  • '*' - ссылка на таблицу имен


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


  • Вставить часть CGI кода в программу, подобно SSI, можно с помощью функции "require". Её синтаксис прост до безобразия:

    require "файл";

    Пример кода, где подпрограмма загружается из внешнего файла:

    # Файл sub.pl sub summ($$){ return ($_[0]+$_[1]) }

    # Файл со скриптом require "sub.pl"; print summ(5,2);

    * * * *

    Напишем функцию, которая возвращает фактореал переданного ей числа.

    sub fact{ # объявляем функцию fact my($sum,$i); # объявляем локальные переменные $sum=1; for ($i=1;$i<=$_[0];$i++){ $sum*=$i; } return $sum # возвращаем значение переменной $sum }

    Примеры вызова такой функции:

    print fact(4);
    print fact(4,22.8,5);

    Результатом выполнения этого кода будет 24 Чтобы избежать вызова функции с ошибочными значениями, используем прототип $, означающий, что функции мы передаем только один парамер:

    sub fact($){

    my($sum,$i); $sum=1; for ($i=1;$i

    Перепишем программу 13 с учетом полученных знаний:

    #!/usr/bin/perl # programm 17 print "Content-type: text/html\n\n";

    &parse_form;

    sub wiev(){ open(file,"file.txt"); @array=; close file; foreach $i(@array){ $u++; print "$u. $i
    "; }}



    print

    Добавить запись
    Удалить запись номер:
    END ;

    if ($FORM{'action'} eq "add") { open(file,">>file.txt"); print file "$FORM{'string'}\n"; close file;

    wiev; } elsif ($FORM{'action'} eq "del") { open(file,"file.txt"); @array=; close file; open(file,">file.txt"); $size=@array; for($i=0;$i

    wiev

    } else{wiev}

    Не правда ли, ощутимая разница?

    * * * *

  • В какую переменную поместится 2-й переданный процедуре параметр?
  • Сколько параметров может принять эта процедура - sub overlay(@); ?


  • Перепишите 3-4 написанные Вами программы с целью ввести туда процедуры.

    [Содержание]  [Вступление]  [необходимое для начала изучения]  [урок 1]  [урок 2]  [урок 3]  [урок 4]  [урок 5]  [урок 6]  [урок 7]  [урок 8]  [урок 9]  [урок 10]  [урок 11]  [урок 12]  [урок 13]  [урок 14]  [урок 15]  [урок 16]  [урок 17]  [урок 18]  [урок 19]  [урок 20]  [урок 21]  [урок 22]  [урок 23]  [урок 24]  [урок 25]  [урок 26]  [урок 27]  [урок 28]  [правила хорошего тона]  [приложение A]  [приложение Б]  [приложение В]  [заключение]  [благодарности] 

    Copyright (c) ClericICN, 2002

    Содержание раздела