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

Re: Нужен ли bash



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.


Reply to: