Read_guestbook.pl - чтение книги



#! e:\perl5\perl# Первая строка, как обычно require "ssi-pl.pl";# Я использую навигационную панель в виде SSI-включения. Для этого используется модуль ssi-pl.pl open(InFile, "guestbook.txt") || die;# Открываем файл с записями гостевой книги. @lines=<InFile>;# Читаем строки в массив. # Выдаем шапку HTML страницы.print <<HTML;Content-type: text/html <html> <head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title>Книга жалоб и предложений - нам пишут</title></head> <body background="../images/background_new.jpg"><div align="left"> <table border="0" height="49"> <tr> <td height="45"></td> <td height="45"><p align="center"><img src="../images/guestbook.GIF" alt="Книга жалоб" HEIGHT="60"></td> </tr></table></div><div align="left"> <table border="0" height="53" cellspacing="0" cellpadding="0"> <tr> <td height="260" align="center"><small> HTMLDoInclude("D:/InetPub/wwwroot/_menu.htm"); print <<HTML; </p> <p align="left"> </td> <td height="53" <td height="53" align="center">Нам пишут:</p> <table border="0" cellspacing="0" cellpadding="0">HTML # Теперь выводим записи в невидимой (в смысле, рамка не видима) таблице.# Чтобы свежие записи отображать первыми, обрабатываем массив строк с конца. for ($i=$#lines; $i>=$[; $i--) #обрабатываем строки файла с конца{ # Разделяем строку на части@item=split('&', $lines[$i]); #разделяем на части # Теперь заменяем HTML тэги в записи (на случай какого-нибудь хитрого юзера)foreach (@item){   $_=~s/</</g;   $_=~s/>/>/g;} # Приступаем непосредственно к выводу записей в HTMLprint "<tr>\n";print '<td В зависимости от поля, где посетителю предлагался выбор понравилось - не понравилось,# рисуем картинку с веселой или грустной мордочкой соответственно. В качестве ALT тэга# картинки пропишем IP адрес посетителя.print '<dt><img src="../images/'.$item[3].'.gif" height="31" alt="';priny $item[6].'" align="absbottom"'."\n"; # Выводим остальные поля.print 'align="absmiddle"><small>'.' '.$item[4]."</small></dt>\n";print '<dt><small>'.$item[1].', '.$item[2]."</small></dt>\n";print '<dt><a href="mailto:'.$item[5].'"><small>'.$item[5].'</small></a></dt>'."\n";print '<dt><small>'.$item[0]."</small></dt>\n";print "</dl>\n";print "</td>\n";print "</tr>\n";} # Осталось вывести окончание HTML print <<HTML; </table> </td> <td height="53" </tr></table></div></body></html>HTML close InFile;# Закрываем файл с записями гостевой книги.

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

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

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*1sub 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)

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

Декларация Пример вызова
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

Здесь:

\'символ' параметр с типом 'символ'
'@' или '%' все оставшиеся параметры как список
'$' скаляр
'&' безымянная подпрограмма
'*' ссылка на таблицу имен
';' разграничитель обязательных и не обязательных параметров

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

Иногда нужно в качестве параметра передать подпрограмме не значение элемента массива а ссылку на него, что бы подпрограмма могла изменить значение элемента. Для этого в Перл к имени переменной добавляется символ '*' Подбное выражение называют 'type glob' так как в Юниксе символом '*' обозначают "все возможные значения". Поэтому '*' для массива означает "все элементы массива".

Для скаляров употряблять '*' не имеет смысла т.к. они и так передаются ссылкой и вы можете изменять значение параметра изменяя например переменную $_[0].


Дата добавления: 2018-04-04; просмотров: 582; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!