Прототипы
Прототипы
Для краткого описания типа передаваемых подпрограмме параметров можно применять прототипы. Если формат передаваемых данных не будет удовлетворять шаблону прототипа, это вызовет ошибку программы. В 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Добавить запись | ||
Удалить запись номер: |
Не правда ли, ощутимая разница?
* * * *
- В какую переменную поместится 2-й переданный процедуре параметр?
- Сколько параметров может принять эта процедура - sub overlay(@); ?
Перепишите 3-4 написанные Вами программы с целью ввести туда процедуры.