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