Alterator/perl

Материал из ALT Linux Wiki

< Alterator(Различия между версиями)
Перейти к: навигация, поиск
(Вывод)
 
(3 промежуточные версии не показаны)
Строка 1: Строка 1:
[[Category:Sisyphus]]
[[Category:Sisyphus]]
-
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/Alterator/perl}}
 
-
!! В данный момент модуль alterator-perl-functions меняется, и вряд ли его стоит сейчас использовать. Надеюсь, что вскоре он придет к какому-то более стабильному состоянию... !!
+
!! В данный момент модуль alterator-perl-functions меняется, и вряд ли его стоит сейчас использовать. Надеюсь, что вскоре он придёт к какому-то более стабильному состоянию... !!
=== alterator-perl-functions ===
=== alterator-perl-functions ===
-
Простейший бакенд выглядит следующим образом:
+
Простейший бэкенд выглядит следующим образом:
-
<pre>#!/usr/bin/perl -w
+
<source lang="perl">
 +
#!/usr/bin/perl -w
use strict;
use strict;
use Alterator::Backend3;
use Alterator::Backend3;
Строка 21: Строка 21:
}
}
-
message_loop(\&on_message);</pre>
+
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) -- понимаются значения ( "on", "off", "yes", "no", "true", "false", "y", "n", "#t", "#f", 1, 0). В остальных случаях модуль ругается и записывает #f
+
* write_bool_param($name, $string) понимаются значения ( "on", "off", "yes", "no", "true", "false", "y", "n", "#t", "#f", 1, 0). В остальных случаях модуль ругается и записывает #f
-
* write_num_param($name, $num) -- записывается число; если дали не число - ругается и записывает 0
+
* 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_string_param('error', $value1, ...)
+
* write_error($value1, ...) обнуление всего предыдущего ответа + write_string_param('error', $value1, ...)
-
'''Автоматическое определение типа значений.''' Так сложилось, что бакенды в альтератор посылают только два типа параметров: string и bool (исключение - actions constrains, но с ними сейчас ничего не понятно). Числа всегда пишутся в виде строк.
+
'''Автоматическое определение типа значений.''' Так сложилось, что бэкенды в альтератор посылают только два типа параметров: string и bool (исключение actions constrains, но с ними сейчас ничего не понятно). Числа всегда пишутся в виде строк.
-
* write_auto_param($name, $value, ...) -- записать пару "имя значение", если значение #t или #f -- оно записывается без кавычек, как bool, иначе - как строка.
+
* 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.
Кажется, что во всех разумных случаях достаточно использовать функции write_error, write_auto_param и write_named_auto_list.
Кажется, что во всех разумных случаях достаточно использовать функции write_error, write_auto_param и write_named_auto_list.
-
TODO:
+
'''TODO:'''
-
* Хочется попробовать сделать еще один уровень абстракции, в котором бакенд предоставляет только функции для заполнения некоторой структуры данных и списки полей, которые следует отдавать по командам read и list...
+
* Хочется попробовать сделать ещё один уровень абстракции, в котором бэкенд предоставляет только функции для заполнения некоторой структуры данных и списки полей, которые следует отдавать по командам read и list...
-
* Доделать проверку вывода бакенда. Проверять хотя бы, что все скобки правильно закрыты, чтоб из бакенда нельзя было повесить альтератор...
+
* Доделать проверку вывода бэкенда. Проверять хотя бы, что все скобки правильно закрыты, чтоб из бэкенда нельзя было повесить альтератор...
==== DEBUG ====
==== DEBUG ====
Строка 65: Строка 67:
==== Использование ====
==== Использование ====
-
В данный момент alterator-perl-functions используется в одном модуле -- alterator-xinetd
+
В данный момент alterator-perl-functions используется в одном модуле alterator-xinetd

Текущая версия на 17: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

 
Личные инструменты