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



Прототипы



Прототипы

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



- Начало - - Назад - - Вперед -