Hello! В сообщении от Thursday 25 September 2008 13:56:12 Dmitry E. Oboukhov написал(а): > VW>> тикль уже научился аналог перлового /e? расставить номера строк в > тексте > > VW> В две строчки. > ну вот видишь, в две, там где достаточно одной ;)
Пример парсера для таких вот данных: Serial_in_COMBINE SEIZ DSS1(1:26,in,,)$ CALL DSS1(1:26,in,84951117001,1111822)$ -> Serial_in(76:5,->)$ 84951547001,9881822 Serial_in_CALL SERIAL_CALL to: 660 SEIZ Serial_out(76:5,->)$ CALL Serial_out(76:5,84951117001->660)$ -> SUB(660/4/11)$ 84951117001,660 SEIZ SUB(514/9/3)$ RLSI DSS1(1:25,out,4951113932,84961113160)$:CV:17 RLSO SUB(7605/5/11)$ Сам скрипт: #!/usr/bin/tclsh set replist [list to: {} :CV: {} ( { } ) { } : { } , { } \/ { } -> { } $ {} \[ {} \] {}] proc unknown {cmdname args} { puts "UNKNOWN: $cmdname $args" } proc parse {} { global replist set line [gets stdin] if { $line ne {} } { eval [string map $replist $line] } } fileevent stdin readable parse vwait eventLoop Вот результат: UNKNOWN: Serial_in_COMBINE UNKNOWN: SEIZ DSS1 1 26 in UNKNOWN: CALL DSS1 1 26 in 84951117001 1111822 Serial_in 76 5 UNKNOWN: 84951547001 9881822 UNKNOWN: Serial_in_CALL UNKNOWN: SERIAL_CALL 660 UNKNOWN: SEIZ Serial_out 76 5 UNKNOWN: CALL Serial_out 76 5 84951117001 660 SUB 660 4 11 84951117001 660 UNKNOWN: SEIZ SUB 514 9 3 UNKNOWN: RLSI DSS1 1 25 out 4951113932 84961113160 17 UNKNOWN: RLSO SUB 7605 5 11 Здесь функция unknown выполняет обработку вызовов несуществующих функций. Определим нужные нам функции (вызовы всех прочих уйдут в unknown и там тихо сгинут или будут записаны в лог, как захотим): proc RLSI {args} { } Заметьте, я понятия не имею, какие там еще строки могут вылезти - просто увидел лексемы и разделители, которые использовали создатели формата. Скорее всего, любые новые типы записей будут корректно преобразованы к тиклевским командам, вызовы которых отобразит мне функция unknown. При необходимости добавлю в список еще пару разделителей. И все, данные распарсились и уже переданы на вход соответствующих функций. А вот такой код написал мой товарищ, притом здесь учтены далеко не все возможные записи (код ): array set patterns { {CALL_DSS1_DSS1} {^CALL\sDSS1\((\d+):(\d+),in,\d+, \d+\)\$\s\-\>\sDSS1\((\d+):(\d+),out,,\)\$\s\[(\d+),(\d+)\]$} {CALL_DSS1_SUB} {^CALL\sDSS1\((\d+):(\d+),in,\d+, \d+\)\$\s\-\>\sSUB\(\d+/(\d+)/(\d+)\)\$\s\[(\d+),(\d+)\]$} {CALL_SUB_DSS1} {^CALL\sSUB\(\d+/(\d+)/(\d+)\)\$\s\-\>\sDSS1\((\d+): (\d+),out,,\)\$\s\[(\d+),(\d+)\]$} {RLSI_DSS1} {^RLSI\sDSS1\((\d+):(\d+),(in|out),(\d+),(\d+)\)\$$} {RLSO_DSS1} {^RLSO\sDSS1\((\d+):(\d+),(in|out),(\d+),(\d+)\)\$$} {RLSI_DSS1_CAUSE} {^RLSI\sDSS1\((\d+):(\d+),(in|out),(\d+), (\d+)\)\$:CV:(\d+)$} {RLSO_DSS1_CAUSE} {^RLSO\sDSS1\((\d+):(\d+),(in|out),(\d+), (\d+)\)\$:CV:(\d+)$} {RLSI_SUB} {^RLSI\sSUB\(\d+/(\d+)/(\d+)\)\$$} {RLSO_SUB} {^RLSO\sSUB\(\d+/(\d+)/(\d+)\)\$$} {RLSI_SUB_CAUSE} {^RLSI\sSUB\(\d+/(\d+)/(\d+)\)\$:CV:(\d+)$} {RLSO_SUB_CAUSE} {^RLSO\sSUB\(\d+/(\d+)/(\d+)\)\$:CV:(\d+)$} } Вы все еще хотите писать на перловых регекспах? Best regards, Alexey. -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]