![]() |
Модуль HTML:
Для обработки HTML-документов, содержащих инструкции с кодом Perl
|
|
Функции
В PHL добавлена всего одна функция ' Функция '
В общем случае, написание функции '
file_name : "file_name.phl"
"file_name.cgi"
"file_path/file_name.phl"
"/file_path/file_name.html"
"http://domain/file_path/file_name.html"
[param] :
Первый аргумент 'file_name' кроме имени файла может содержать зарезервированные слова " Если файл 'file_name' имеет расширение ' При вызове функции ' При скалярном или списковом контексте результат возвращается в виде запрашиваемого значения переменной или списка значений соответственно.
Второй аргумент функции ' • Параметр '
|
| 1 | <%pl |
| 2 | include("file_name.txt", "phl"); |
| 3 | my $result = include("file_name.html", "phl decode=utf-8"); |
| 4 | my @result = include("file_name", "phl abs"); |
| 5 | %> |
Позволяет проверить существование файла.
| 1 | <%pl |
| 2 | my $exist_file = include("$file_name", "exist"); |
| 3 | if ($exist_file) { |
| 4 | print "Файл $file_name найден"; |
| 5 | } else { |
| 6 | print "Файл $file_name не найден"; |
| 7 | } |
| 8 | %> |
Возвращает список из 5 элементов: Content type, Document length, Modified time, Expires, Server.
| 1 | <%pl |
| 2 | my @head = include("$file_name", "head"); |
| 3 | %> |
Если указан параметр '
| 1 | %pl include("$file_name", "abs"); |
При указании данного параметра результат выполнения кода включаемого файла игнорируется.
| 1 | <%pl include("$file_name", "no_eval") %> |
Если указан параметр '
| 1 | <%pl |
| 2 | include("$file_name", "ns"); |
| 3 | %> |
Как и функция '
| 1 | <%pl |
| 2 | include("$file_name", "open"); |
| 3 | my $result = include("$file_name", "open decode=koi8-r"); |
| 4 | my @result = include("$file_name", "on, decode=cp1251, abs"); |
| 5 | %> |
В скалярном или неопределённом контексте данные считываются "побайтно":
| 1 | my $code; |
| 2 | open(my $fh, "<$file_name"); |
| 3 | while (sysread($fh, my $bate, 8*1024)) { |
| 4 | $code .= $bate; |
| 5 | } |
| 6 | close($fh); |
В списковом контексте данные файла считываются построчно:
| 1 | open(my $fh, "$file_name"); |
| 2 | flock($fh, 1); |
| 3 | @result = <$fh>; |
| 4 | close($fh); |
При наличии параметра '
Если кодировка не указана или отсутствует параметр '
| 1 | $_ = decode($decode, $_); |
| 2 | $_ = decode($phl{encoding_in}, $_); |
Если кодировка результирующего документа отлична от '
| 1 | $_ = encode($phl{encoding_out}, $_); |
Кодирование и декодирование данных осуществляется с использованием стандартного модуля '
Данный параметр предназначен для подключения cgi-скриптов, написанных на Perl.
| 1 | <%pl |
| 2 | include("file_name.cgi"); |
| 3 | include("$file_name", "cgi"); |
| 4 | include("$file_name", "cgi require"); |
| 5 | include("file_name.cgi", "decode=cp866"); |
| 6 | %> |
Совместно с параметром '
Служит для декодирования cgi-скриптов Perl, написанных не в UTF-8 кодировке.
Указывает на подключение cgi-скриптов с помощью стандартной функции '
| 1 | require "$file_name"; |
Применяется для загрузки web-документа с помощью стандартного модуля '
| 1 | <%pl |
| 2 | include("file_name.html", "socket"); |
| 3 | include("http://domain/"); |
| 4 | my $text = include("http://domain/file_path/file_name.html", "decode=cp1251"); |
| 5 | my @result = include("$file_name", "decode no_abs"); |
| 6 | %> |
Если адрес включаемого в документ файла начинается с http или ftp, то указывать параметр '
Совместно с параметром '
Позволяет проверить существование домена, файла, адреса.
| 1 | <%pl |
| 2 | my @include_name_file = ( |
| 3 | 'dir1/name_file.html', |
| 4 | '/dir2/name_file.php', |
| 5 | 'http://www.yandex.ru', |
| 6 | 'http://www.yandex/eklmnfjoeqxngsitwf.html', |
| 7 | 'http://eklmnfjoeqxngsitwfhoevd.ru' |
| 8 | ); |
| 9 | |
| 10 | foreach my $name_file (@include_name_file) { |
| 11 | my $ex = include("$name_file", "socket exist"); |
| 12 | if ($ex) { |
| 13 | print "Файл '$name_file' найден<br>"; |
| 14 | } elsif (!defined $ex) { |
| 15 | print "Ресурс '$name_file' не отвечает<br>"; |
| 16 | } else { |
| 17 | print "Файл '$name_file' не найден<br>"; |
| 18 | } |
| 19 | } |
| 20 | %> |
Возвращает заголовок документа
| 1 | <%pl |
| 2 | foreach my $name_file (@test_name_file) { |
| 3 | my @head = include("$name_file", "socket head"); |
| 4 | if ($#head) { |
| 5 | print "Заголовок от '$name_file' получен => '@head[0..3]'<br>"; |
| 6 | } else { |
| 7 | print "Заголовка от '$name_file' нет => '@head'<br>"; |
| 8 | } |
| 9 | } |
| 10 | %> |
По умолчанию, все относительные ссылки заменяются на абсолютные, но если указан параметр '
| 1 | %pl include("$file_name", "socket no_abs"); |
Служит для декодирования документов из кодировки, указанной параметром '
Если параметр '
Если параметр '
При использовании параметра '
| 1 | <%pl |
| 2 | include("http://www.rbc.ru", "decode=utf-8"); |
| 3 | include("http://www.mail.ru", "decode"); |
| 4 | my $html_text1 = include("http://ru.motorsport.com"); |
| 5 | my $html_text2 = include("http://www.google.com", "nd"); |
| 6 | %> |
Код загружаемого файла выполняется в параллельном дочернем процессе, созданном в результате запуска '
| 1 | <%pl |
| 2 | include("$file_name", "fork"); |
| 3 | %> |
Результат выполнения параллельного процесса можно вернуть в родительский, используя '
| 1 | <%pl |
| 2 | # Код дочернего процесса $phl_var{name} |
| 3 | my $f = "Передаваемые данные"; |
| 4 | sleep 1; |
| 5 | return $f; |
| 6 | %> |
В третьем аргументе функции '
| 1 | <%pl |
| 2 | include("$file_name", "fork", "f1"); |
| 3 | %> |
Для того, чтобы вернуть результат выполнения дочернего процесса в точку вызова функции '
Результат отработки параллельного процесса можно вернуть обратно в родительский процесс, вызвав '
| 1 | <%pl |
| 2 | $result = include("$file_name", "fork waitpid"); |
| 3 | @result = include("$file_name", "fork", "waitpid"); |
| 4 | %> |
На самом деле, можно вообще отказаться от параметра '
| 1 | <%pl |
| 2 | @result = include("$file_name", "fork", ""); |
| 3 | $result = include("$file_name", "fk"); |
| 4 | %> |
Результат выполнения процесса вернуть не удастся, если только, не попробовать что-либо записать в файл или вывести на экран.
| 1 | <%pl |
| 2 | include("$file_name", "fork no_waitpid"); |
| 3 | include("$file_name", "fork", "no_waitpid"); |
| 4 | %> |
Для обращения за результатом выполнения дочернего процесса можно использовать функцию '
| 1 | <%pl |
| 2 | include("$file_name", "fork", "f1"); |
| 3 | |
| 4 | # Далее может следовать тело программы с некоторым кодом |
| 5 | |
| 6 | my $rezult = include("JOIN", "f1"); |
| 7 | %> |
Вернуть результаты нескольких или даже всех параллельных процессов можно обратившись к хэшу, ключами которого будут имена процессов, значениями - результаты их выполнения.
| 1 | <%pl |
| 2 | my %join_2_3 = include("JOIN", "f2 f3"); |
| 3 | print "Результат процесса 'f2' = $join_2_3{f2}<br>"; |
| 4 | |
| 5 | my %join_all = include("JOIN"); |
| 6 | foreach my $key(keys(%join_all)) { |
| 7 | if (ref $join_all{$key}) { |
| 8 | my @result = @{$join_all{$key}}; |
| 9 | print "Результат процесса '$key' = '$join_all{$key}' => и первый разыменованный элемент массива = '$result[0]'<br>"; |
| 10 | } else { |
| 11 | print "Результат процесса '$key' = '$join_all{$key}'<br>"; |
| 12 | } |
| 13 | } |
| 14 | %> |
Создается, так называемая, "нить" ("поток") - своеобразная ветка процесса, в которой возможно выполнение кода параллельно коду породившего нить процесса.
Для создания нити используется стандартный модуль '
| 1 | <%pl |
| 2 | include("$file_name", "thread"); |
| 3 | %> |
Как и в случае с параметром '
Результат выполнения нити возвращается в точку вызова, при этом родительский процесс временно прекращает своё выполнение и ждет получения данных (от созданных потоков).
| 1 | <%pl |
| 2 | $result = include("$file_name", "thread join"); |
| 3 | @result = include("$file_name", "thread", "join"); |
| 4 | %result = include("$file_name", "thread"); |
| 5 | %> |
Нить создается, но что в ней происходит основная ветка процесса не знает.
| 1 | <%pl |
| 2 | include("$file_name", "thread detach"); |
| 3 | include("$file_name", "thread", "detach"); |
| 4 | %> |
Вернуть данные в любую точку основной ветки процесса можно, присвоив нити имя (по аналогии с дочерним процессом, создаваемым параметром '
| 1 | <%pl |
| 2 | include("$file_name", "thread", "t1"); |
| 3 | include("$file_name", "thread", "t2"); |
| 4 | include("$file_name", "thread", "t3"); |
| 5 | |
| 6 | my $rezult = include("JOIN", "t2"); |
| 7 | print "Результат нити 't2' = '$rezult'<br>"; |
| 8 | |
| 9 | my %join = include("JOIN", "t1 t3"); |
| 10 | print "Результат нити 't1' = '$join{t1}'<br>"; |
| 11 | print "Результат нити 't3' = '$join{t3}'<br>"; |
| 12 | %> |
При желании можно определить свои собственные (дополнительные) параметры или переопределить существующие. Это реализуется с помощью специально оформленных модулей.
Так, к примеру, с помощью модуля '
пример:
| 1 | %pl -ev use HTML::Phl::Utilit; |
| 2 | |
| 3 | <%pl |
| 4 | include("$file_name", "as"); |
| 5 | %> |