Alterator/perl: различия между версиями
(→Вывод) |
Ilis (обсуждение | вклад) Нет описания правки |
||
(не показаны 2 промежуточные версии 2 участников) | |||
Строка 1: | Строка 1: | ||
[[Category:Sisyphus]] | [[Category:Sisyphus]] | ||
!! В данный момент модуль alterator-perl-functions меняется, и вряд ли его стоит сейчас использовать. Надеюсь, что вскоре он | !! В данный момент модуль alterator-perl-functions меняется, и вряд ли его стоит сейчас использовать. Надеюсь, что вскоре он придёт к какому-то более стабильному состоянию... !! | ||
=== alterator-perl-functions === | === alterator-perl-functions === | ||
Простейший | Простейший бэкенд выглядит следующим образом: | ||
< | <source lang="perl"> | ||
#!/usr/bin/perl -w | |||
use strict; | use strict; | ||
use Alterator::Backend3; | use Alterator::Backend3; | ||
Строка 21: | Строка 21: | ||
} | } | ||
message_loop(\&on_message);</ | message_loop(\&on_message); | ||
</source> | |||
==== Поддержка переводов ==== | ==== Поддержка переводов ==== | ||
* определена функция _() | * определена функция _() | ||
* перед запуском message_loop надо записать название основного словаря в переменную $TEXTDOMAIN. Если переменная не выставлена, модуль ругается и выставляет ее в alterator-<имя | * перед запуском message_loop надо записать название основного словаря в переменную $TEXTDOMAIN. Если переменная не выставлена, модуль ругается и выставляет ее в alterator-<имя бэкенда> | ||
* если в функции _() хочется использовать словарь, отличный от $TEXTDOMAIN, его можно передать вторым аргументом: _("text", $OTHER_TEXTDOMAIN) | * если в функции _() хочется использовать словарь, отличный от $TEXTDOMAIN, его можно передать вторым аргументом: _("text", $OTHER_TEXTDOMAIN) | ||
* язык выставляется из параметра language заново для каждой команды. Значение по умолчанию 'en_EN' | * язык выставляется из параметра language заново для каждой команды. Значение по умолчанию 'en_EN' | ||
Строка 35: | Строка 37: | ||
'''Самый низкий уровень абстракции.''' Возможно, потом получится от этих функций отказаться: | '''Самый низкий уровень абстракции.''' Возможно, потом получится от этих функций отказаться: | ||
* write_plain($string1, ...) | * write_plain($string1, ...) — запись произвольной строки | ||
* write_begin() | * write_begin() — запись "(" | ||
* write_end() | * write_end() — запись ")" | ||
'''Запись пары "имя значение" для разных типов значений.''' | '''Запись пары "имя значение" для разных типов значений.''' | ||
* write_string_param($name, $string1, ...) | * write_string_param($name, $string1, ...) — защищаются символы " и \, выводится строка в кавычках | ||
* write_bool_param($name, $string) | * write_bool_param($name, $string) — понимаются значения ( "on", "off", "yes", "no", "true", "false", "y", "n", "#t", "#f", 1, 0). В остальных случаях модуль ругается и записывает #f | ||
* write_num_param($name, $num) | * write_num_param($name, $num) — записывается число; если дали не число — ругается и записывает 0 | ||
Во всех этих функциях $name должно содержать только символы [0-9A-Za-z_], иначе модуль ругается и записывает <u>bad_symbol</u> | Во всех этих функциях $name должно содержать только символы [0-9A-Za-z_], иначе модуль ругается и записывает <u>bad_symbol</u> | ||
'''Запись сообщений об ошибках.''' | '''Запись сообщений об ошибках.''' | ||
* write_error($value1, ...) | * write_error($value1, ...) — обнуление всего предыдущего ответа + write_string_param('error', $value1, ...) | ||
'''Автоматическое определение типа значений.''' Так сложилось, что | '''Автоматическое определение типа значений.''' Так сложилось, что бэкенды в альтератор посылают только два типа параметров: string и bool (исключение — actions constrains, но с ними сейчас ничего не понятно). Числа всегда пишутся в виде строк. | ||
* write_auto_param($name, $value, ...) | * write_auto_param($name, $value, ...) — записать пару "имя значение", если значение #t или #f — оно записывается без кавычек, как bool, иначе - как строка. | ||
* write_named_auto_list($name, @alist) -- запись списка вида "(name n1 v1 n2 v2 n3 v3)"... Пары n1 v1 и т.д. записываются с помощью write_auto_param. | * write_named_auto_list($name, @alist) -- запись списка вида "(name n1 v1 n2 v2 n3 v3)"... Пары n1 v1 и т.д. записываются с помощью write_auto_param. | ||
Строка 56: | Строка 58: | ||
'''TODO:''' | '''TODO:''' | ||
* Хочется попробовать сделать | * Хочется попробовать сделать ещё один уровень абстракции, в котором бэкенд предоставляет только функции для заполнения некоторой структуры данных и списки полей, которые следует отдавать по командам read и list... | ||
* Доделать проверку вывода | * Доделать проверку вывода бэкенда. Проверять хотя бы, что все скобки правильно закрыты, чтоб из бэкенда нельзя было повесить альтератор... | ||
==== DEBUG ==== | ==== DEBUG ==== | ||
Строка 65: | Строка 67: | ||
==== Использование ==== | ==== Использование ==== | ||
В данный момент alterator-perl-functions используется в одном модуле | В данный момент alterator-perl-functions используется в одном модуле — alterator-xinetd |
Текущая версия от 20:41, 24 октября 2008
!! В данный момент модуль alterator-perl-functions меняется, и вряд ли его стоит сейчас использовать. Надеюсь, что вскоре он придёт к какому-то более стабильному состоянию... !!
alterator-perl-functions
Простейший бэкенд выглядит следующим образом:
#!/usr/bin/perl -w
use strict;
use Alterator::Backend3;
$TEXTDOMAIN='alterator-test';
$DEBUG = 1;
sub on_message{
my message=shift;
if ($message->{action} eq 'read'){
write_string_param('name', 'value');
}
}
message_loop(\&on_message);
Поддержка переводов
- определена функция _()
- перед запуском message_loop надо записать название основного словаря в переменную $TEXTDOMAIN. Если переменная не выставлена, модуль ругается и выставляет ее в alterator-<имя бэкенда>
- если в функции _() хочется использовать словарь, отличный от $TEXTDOMAIN, его можно передать вторым аргументом: _("text", $OTHER_TEXTDOMAIN)
- язык выставляется из параметра language заново для каждой команды. Значение по умолчанию 'en_EN'
Вывод
В процедуре on_message сделано перенаправление STDOUT->STDERR. Все ответы должны выполняться только специальными командами.
Самый низкий уровень абстракции. Возможно, потом получится от этих функций отказаться:
- write_plain($string1, ...) — запись произвольной строки
- write_begin() — запись "("
- write_end() — запись ")"
Запись пары "имя значение" для разных типов значений.
- write_string_param($name, $string1, ...) — защищаются символы " и \, выводится строка в кавычках
- write_bool_param($name, $string) — понимаются значения ( "on", "off", "yes", "no", "true", "false", "y", "n", "#t", "#f", 1, 0). В остальных случаях модуль ругается и записывает #f
- write_num_param($name, $num) — записывается число; если дали не число — ругается и записывает 0
Во всех этих функциях $name должно содержать только символы [0-9A-Za-z_], иначе модуль ругается и записывает bad_symbol
Запись сообщений об ошибках.
- write_error($value1, ...) — обнуление всего предыдущего ответа + write_string_param('error', $value1, ...)
Автоматическое определение типа значений. Так сложилось, что бэкенды в альтератор посылают только два типа параметров: string и bool (исключение — actions constrains, но с ними сейчас ничего не понятно). Числа всегда пишутся в виде строк.
- write_auto_param($name, $value, ...) — записать пару "имя значение", если значение #t или #f — оно записывается без кавычек, как bool, иначе - как строка.
- write_named_auto_list($name, @alist) -- запись списка вида "(name n1 v1 n2 v2 n3 v3)"... Пары n1 v1 и т.д. записываются с помощью write_auto_param.
Кажется, что во всех разумных случаях достаточно использовать функции write_error, write_auto_param и write_named_auto_list.
TODO:
- Хочется попробовать сделать ещё один уровень абстракции, в котором бэкенд предоставляет только функции для заполнения некоторой структуры данных и списки полей, которые следует отдавать по командам read и list...
- Доделать проверку вывода бэкенда. Проверять хотя бы, что все скобки правильно закрыты, чтоб из бэкенда нельзя было повесить альтератор...
DEBUG
- Если переменная $DEBUG выставлена в ненулевое значение, модуль выдает на stderr все полученные и отправленные сообщения.
Использование
В данный момент alterator-perl-functions используется в одном модуле — alterator-xinetd