Для достижения большей гибкости работы в PHL реализована возможность задавать собственные указатели инструкции [sh], ключи [keys], первый аргумент [include] и параметры [param] функции 'include()'.
<%[sh] [keys]
...
include("[include]", "[param]");
...
%>
Новые ключи, параметры и указатели импортируются в phl.pm из специально написанных для данных целей модулей.
Для примера в PHL включены 4 модуля:
1 | use HTML::Phl::Utilit; |
2 | use HTML::Phl::Psimple; |
3 | use HTML::Phl::Php; |
4 | use HTML::Phl::Ru; |
Модули можно подключить как в файле 'phl.pm' или 'config.phl', так и в файле PHL.
1 | %pl -ev use HTML::Phl::Utilit |
2 | |
3 | <%pl |
4 | # код perl |
5 | %> |
• Модуль 'HTML::Phl::Utilit'
Модуль экспортирует в программу 5 ключей, 2 параметра и 2 аргумента для функции 'include()'.
[keys] :
-listing <=> -lt
-analys <=> -as
-config <=> -cf
-timer <=> -tm
-no_timer <=> -nt
[param] :
listing <=> lt
analys <=> as
[include] :
CONFIG
TIMER
Ключи '-listing' [ '-lt' ] и '-analys' [ '-as' ] и параметры 'listing' ( 'lt' ) и 'analys' ( 'as' ) дают, возможность просмотреть листинг программы или сформированный анализатором код perl перед его выполнением eval.
Ключ '-listing' [ '-lt' ]
1 | Текст HTML 1 |
2 | <br><br> |
3 | |
4 | <%pl -lt |
5 | my $test = "Текст Perl<br>"; |
6 | print "$test"; |
7 | %> |
8 | <br> |
9 | |
10 | Текст HTML 2 |
▼
Результат
Текст HTML 1
1 | my $test = "Текст Perl<br>"; |
2 | print "$test"; |
Текст HTML 2
Ключ '-analys' [ '-as' ]
1 | %pl -as |
2 | |
3 | <%pl |
4 | my $test = "Текст Perl<br>"; |
5 | print ("$test"); |
6 | %> |
7 | |
8 | Текст HTML и <%pl= $test %> |
▼
Результат
1 | ; |
2 | print <<'[HTML]'; |
3 | |
4 | [HTML] |
5 | my $test = "Текст Perl<br>"; |
6 | print ("$test"); |
7 | print <<'[HTML]'; |
8 | |
9 | [HTML] |
10 | print <<'[HTML]' =~ /(.*)/; |
11 | Текст HTML и |
12 | [HTML] |
13 | print($test); |
Ключ '-config' [ '-cf' ] или аргумент 'CONFIG' функции 'include()'
выводят на печать хэш %phl конфигурационных переменных.
1 | %pl -config |
2 | |
3 | или так |
4 | |
5 | <%pl |
6 | include("CONFIG"); |
7 | %> |
▼
Результат
Конфигурационные переменные
bottom = ''
bufer = '1'
config = 'config.phl'
config_path = ''
encoding_in = 'utf8'
encoding_out = 'utf8'
finde_config = 'yes'
header = 'Content-type: text/html; charset=utf-8
'
index = 'index.phl'
ln = '%'
locale = 'utf8'
lt = '<%'
pl = 'phl'
rt = '%>'
script_dir = ''
sh = 'pl'
threads = '1'
timer = '0'
top = ''
Ключи '-timer' [ '-tm' ] и '-no_timer' [ '-nt' ] позволяют изменить механизм вывода на экран временных промежутков работы компонентов программы,
а используя аргумент 'TIMER' функции 'include()' можно задать свой таймер.
1 | <%pl |
2 | # запуск встроенного таймера |
3 | %pl -timer |
4 | |
5 | # остановка встроенного таймера |
6 | %pl -nt |
7 | %> |
▼
Пример
1. Запускаем timer ключем '-timer' или '-tm'
timer = 4
2. Проверяем результат на тестовом 'include()' (без параметров)
Результат =>
• Время - 0.048289 [0.018042 ] ← INCLUDE_BEGINE ()
• Время - 0.048469 [0.018207 ] ← INCLUDE_END ()
test:
timer = 4
3. Выключаем timer ключем '-no_timer' или '-nt'
4. Проверяем результат на тестовом 'include()'
Результат => test:
timer = 0
1 | <%pl |
2 | # пример создания своего таймера |
3 | include("TIMER", "имя таймера"); |
4 | %> |
▼
Пример
Создаем таймер
1
• Время - 0.000008 ← TIMER (name_timer_1)
ждем некоторое время -
sleep 0.2 • Время - 0.200479 ← TIMER (name_timer_1)
Новый таймер
2
• Время - 0.000003 ← TIMER (name_timer_2)
ждем некоторое время -
sleep 0.5 • Время - 0.701079 ← TIMER (name_timer_1)
• Время - 0.500481 ← TIMER (name_timer_2)
Новый таймер
3
• Время - 0.000003 ← TIMER (name_timer_3)
ждем некоторое время -
sleep 0.35 • Время - 1.051672 ← TIMER (name_timer_1)
• Время - 0.851112 ← TIMER (name_timer_2)
• Время - 0.350620 ← TIMER (name_timer_3)
• Модуль 'HTML::Phl::Php'
Экспортирует указатель 'php', превращая указатель инструкции '<%pl' в '<%php', для возможности работы с кодом языка программирования PHP;
1 | %pl -ev use HTML::Phl::Php; |
2 | |
3 | %pl our $pl = 5; |
4 | |
5 | Исходная переменная PERL: $pl = <b>'<%pl= $pl %>'</b>. |
6 | <br><br> |
7 | |
8 | <%php |
9 | echo "Значение переменной \$pl передаем в PHP (\$pl -> \$php).<br>"; |
10 | OUT_PERL($pl -> $php); |
11 | |
12 | echo "<li>переменная \$php = $php.</li><br>"; |
13 | |
14 | echo "В PHP изменяем значение переменной: \$php = 2 * \$php + 1.5.<br><br>"; |
15 | $php = 2 * $php + 1.5; |
16 | |
17 | echo "Возвращаем значение переменной \$php в PERL (\$php -> \$pl).<br>"; |
18 | IN_PERL($php -> $pl); |
19 | %> |
20 | |
21 | <li>Результирующая переменная PERL: $pl = <b>'<%pl= $pl %>'</b></li>. |
▼
Результат
Исходная переменная PERL: $pl =
'5'.
301 Moved Permanently
Moved Permanently
The document has moved here.
Apache/2.4.55 (Unix) Server at phl.cherti.ru Port 80
Результирующая переменная PERL: $pl = ''.
• Модуль 'HTML::Phl::Ru'
Экспортирует указатель 'рус', превращая указатель инструкции '<%pl' в '<%рус', позволяя работать с некоторыми функциями и операторами кириллического написания.
1 | %pl -ev use HTML::Phl::Ru; |
2 | |
3 | <%рус |
4 | my @имена_файлов = ( |
5 | 'file_exist.phl', |
6 | 'http://www.pushkinmuseum.ru', |
7 | 'http://www.pushkinmuseum.ru/467899', |
8 | 'http://eklmn12344556778.ru' |
9 | ); |
10 | |
11 | foreach my $имя_файла (@имена_файлов) { |
12 | my $найдено = ВКЛЮЧИТЬ("$имя_файла", "socket exist"); |
13 | ЕСЛИ ($найдено) { |
14 | ПЕЧАТЬ "'$имя_файла' - <B>найден</B><br>"; |
15 | } ИЛИ ЕСЛИ (!defined $найдено) { |
16 | ПЕЧАТЬ "'$имя_файла' - <B>не отвечает</B><br>"; |
17 | } ИНАЧЕ { |
18 | ПЕЧАТЬ ("'$имя_файла' - <B>не найден</B><br>"); |
19 | } |
20 | } |
21 | %> |
▼
Результат
'file_exist.phl' - не найден
'http://www.pushkinmuseum.ru' - не найден
'http://www.pushkinmuseum.ru/467899' - не найден
'http://eklmn12344556778.ru' - не отвечает
• Модуль 'HTML::Phl::Psimple'
Экспортирует параметр 'Simple' ['sl'] для работы со стандартным модулем Perl 'LWP::Simple';
Спецификация модулей-расширений
Для возможности экспорта ключей, параметров и указателей модули должны размещаться в определенной папке (по умолчанию - в 'Phl', находящейся рядом с основным файлом программы 'phl.pm')
и содержать двумерный хэш '%phl_import', в котором ключами второго хеша будут экспортируемые ключи, параметры и указатели.
Хэш '%phl_import' может включать 5 ключей - 'sh', 'key', 'param', 'include' и 'eval'.
1 | our %phl_import = ( |
2 | key => { |
3 | tm => \&HTML::Phl::Utilit::key_timer, |
4 | im => \&HTML::Phl::Utilit::print_import, |
5 | }, |
6 | include => { |
7 | TIMER => \&HTML::Phl::Utilit::my_timer, |
8 | CONFIG => \&HTML::Phl::Utilit::config, |
9 | }, |
10 | param => {lt => \&HTML::Phl::Utilit::open_listing}, |
11 | sh => {'рус' => \&HTML::Phl::Ru::ru_perl}, |
12 | eval => {as => \&HTML::Phl::Utilit::eval_code} |
13 | ); |
○ Ключ хэша 'sh'
Позволяет использовать иное написание инструкций совместно с принятым по умолчанию в настройках.
К примеру, наряду с использованием конструкции '<%pl ... %>' для Perl-кода можно задать блоки инструкций вида '<%xml ... %>' для кода XML.
Значением ключа хэша 'sh', в таком случае, должен являться анонимный хэш, ключом которого будет новое расширение (в нашем случае - 'xml'), значением - ссылка на подпрограмму обработки кода, заложенного в инструкции (к примеру '\&HTML::Phl::Name_module::my_xml').
В подпрограмму в таком случае, будут переданы следующие элементы @_ = ($code, $sh, $nota, $key),
где
$code - код, заключенный внутри инструкции;
$sh - наше новое расширение инструкции;
$nota, $key - разделитель и ключи блока инструкции (при их наличии).
Подпрограмма модуля должна вернуть обратно в программу измененный perl-код для дальнейшего его выполнения eval.
○ Ключ хэша 'key'
Позволяет использовать ключи, отличные от используемых по умолчанию.
Если анализатор среди ключей инструкций найдет ключ, соответствующий ключу анонимного хэша 'key', в подпрограмму, указанную в анонимном хэше,
будет передан массив @_ = ("$code", "$number_blok", "$key"),
где $number_blok - номер блока инструкции.
○ Ключ хэша 'param'
Позволяет использовать свои параметры в функции 'include()'.
В подпрограмму, указанную в анонимном хэше,
будет передан массив @_ = ("$file_include", "$param", "$name_process", "$file_url", "$file_name"),
где
$file_include - первый аргумент функции 'include()';
$param - параметры, указанные в 'include()';
$name_process - имя дочернего процесса или потока (нити) ;
$file_url - путь к файлу, включающий доменное имя;
$file_name - имя файла, выделенное из $file_include.
○ Ключ хэша 'include'
Позволяет перехватить выполнение функции 'include()', передав управление модулю.
В подпрограмму, указанную в анонимном хэше,
будет передан массив @_ = ("$include", "$param", "$name_process", "$file_url", "$file_name"),
где
$include - первый аргумент функции 'include()'.
○ Ключ хэша 'eval'
Позволяет выполнять манипуляции с кодом перед его выполнением eval.
В подпрограмму, указанную в анонимном хэше, будет передан массив @_ = ("$code", "$param", "$phl_var{name}", "$file_include").