Модуль 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 | %> |