[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Нужен ли bash



On 19:32 Thu 25 Sep     , Alexey Pechnikov wrote:
AP> Hello!

AP> В сообщении от Thursday 25 September 2008 13:56:12 Dmitry E. Oboukhov
AP> написал(а):
AP>>>> тикль уже научился аналог перлового /e? расставить номера строк в
AP>> тексте
AP>> 
AP>>> В две строчки.
AP>> ну вот видишь, в две, там где достаточно одной ;)

AP> Пример парсера для таких вот данных:

нихрена не понял в постановке задачи, кто на ком стоял?
тебе надо вызвать функцию SEIZ, CALL итп передав ей параметры? а что не
вызвалось передать функции unknown?


sub foo_RLSI
{
	...
}

sub foo_unknown
{
	...
}
while(<>)
{
	$_= [ split /\s+/, $_, 2 ];
	eval "foo_$$_[0](\$\$_[1])";
	foo_unknown($$_[1]) if $@;
}

AP> Serial_in_COMBINE
AP> SEIZ DSS1(1:26,in,,)$
AP> CALL DSS1(1:26,in,84951117001,1111822)$ -> Serial_in(76:5,->)$
AP> 84951547001,9881822
AP> Serial_in_CALL
AP> SERIAL_CALL to: 660
AP> SEIZ Serial_out(76:5,->)$
AP> CALL Serial_out(76:5,84951117001->660)$ -> SUB(660/4/11)$ 84951117001,660
AP> SEIZ SUB(514/9/3)$
AP> RLSI DSS1(1:25,out,4951113932,84961113160)$:CV:17
AP> RLSO SUB(7605/5/11)$

AP> Сам скрипт:
AP> #!/usr/bin/tclsh
AP> set replist [list to: {} :CV: {} ( { } ) { } : { } , { } \/ { } -> { } $ {} \[
AP> {} \] {}]
AP> proc unknown {cmdname args} {
AP> puts "UNKNOWN: $cmdname $args"
AP> }
AP> proc parse {} {
AP> global replist
AP> set line [gets stdin]
AP> if { $line ne {} } {
AP> eval [string map $replist $line]
AP> }
AP> }
AP> fileevent stdin readable parse
AP> vwait eventLoop

AP> Вот результат:

AP> UNKNOWN: Serial_in_COMBINE
AP> UNKNOWN: SEIZ DSS1 1 26 in
AP> UNKNOWN: CALL DSS1 1 26 in 84951117001 1111822 Serial_in 76 5
AP> UNKNOWN: 84951547001 9881822
AP> UNKNOWN: Serial_in_CALL
AP> UNKNOWN: SERIAL_CALL 660
AP> UNKNOWN: SEIZ Serial_out 76 5
AP> UNKNOWN: CALL Serial_out 76 5 84951117001 660 SUB 660 4 11 84951117001 660
AP> UNKNOWN: SEIZ SUB 514 9 3
AP> UNKNOWN: RLSI DSS1 1 25 out 4951113932 84961113160 17
AP> UNKNOWN: RLSO SUB 7605 5 11

AP> Здесь функция unknown выполняет обработку вызовов несуществующих функций.
AP> Определим нужные нам функции (вызовы всех прочих уйдут в unknown и там тихо
AP> сгинут или будут записаны в лог, как захотим):

AP> proc RLSI {args} {
AP> }

AP> Заметьте, я понятия не имею, какие там еще строки могут вылезти - просто
AP> увидел лексемы и разделители, которые использовали создатели формата. Скорее
AP> всего, любые новые типы записей будут корректно преобразованы к тиклевским
AP> командам, вызовы которых отобразит мне функция unknown. При необходимости
AP> добавлю в список еще пару разделителей. И все, данные распарсились и уже
AP> переданы на вход соответствующих функций.

AP> А вот такой код написал мой товарищ, притом здесь учтены далеко не все
AP> возможные записи (код ):
AP> array set patterns {
AP> {CALL_DSS1_DSS1} {^CALL\sDSS1\((\d+):(\d+),in,\d+,
AP> \d+\)\$\s\-\>\sDSS1\((\d+):(\d+),out,,\)\$\s\[(\d+),(\d+)\]$}
AP> {CALL_DSS1_SUB} {^CALL\sDSS1\((\d+):(\d+),in,\d+,
AP> \d+\)\$\s\-\>\sSUB\(\d+/(\d+)/(\d+)\)\$\s\[(\d+),(\d+)\]$}
AP> {CALL_SUB_DSS1} {^CALL\sSUB\(\d+/(\d+)/(\d+)\)\$\s\-\>\sDSS1\((\d+):
AP> (\d+),out,,\)\$\s\[(\d+),(\d+)\]$}
AP> {RLSI_DSS1} {^RLSI\sDSS1\((\d+):(\d+),(in|out),(\d+),(\d+)\)\$$}
AP> {RLSO_DSS1} {^RLSO\sDSS1\((\d+):(\d+),(in|out),(\d+),(\d+)\)\$$}
AP> {RLSI_DSS1_CAUSE} {^RLSI\sDSS1\((\d+):(\d+),(in|out),(\d+),
AP> (\d+)\)\$:CV:(\d+)$}
AP> {RLSO_DSS1_CAUSE} {^RLSO\sDSS1\((\d+):(\d+),(in|out),(\d+),
AP> (\d+)\)\$:CV:(\d+)$}
AP> {RLSI_SUB} {^RLSI\sSUB\(\d+/(\d+)/(\d+)\)\$$}
AP> {RLSO_SUB} {^RLSO\sSUB\(\d+/(\d+)/(\d+)\)\$$}
AP> {RLSI_SUB_CAUSE} {^RLSI\sSUB\(\d+/(\d+)/(\d+)\)\$:CV:(\d+)$}
AP> {RLSO_SUB_CAUSE} {^RLSO\sSUB\(\d+/(\d+)/(\d+)\)\$:CV:(\d+)$}
AP> }

AP> Вы все еще хотите писать на перловых регекспах?
ну в общем и тут нормально написано, регекспы описывают твои строки
вопрос нужно ли это делать или нет - вопрос алгоритма, ведь у тебя
другой алгоритм использован, если ты этот же алгоритм на тикле нарисуешь
получится то же самое

AP> Best regards, Alexey.
--

. ''`. Dmitry E. Oboukhov
: :’  : unera@debian.org
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537

Attachment: signature.asc
Description: Digital signature


Reply to: