Я пытаюсь разработать регулярное выражение Perl для анализа вывода команды из утилиты IBM runmqsc.
Каждая интересующая строка содержит одну или несколько пар атрибут / значение в формате: «ATTRIBUTE (VALUE)». Значение атрибута может быть пустым или содержать саму скобку. Как правило, в данной строке появляется максимум две пары атрибут / значение, поэтому регулярное выражение записывается в соответствии с этим предположением.
Пример ввода в Perl RE:
CHANNEL(TO.IPTWX01) CHLTYPE(CLUSRCVR)
DISCINT(6000) SHORTRTY(10)
TRPTYPE(TCP) DESCR( )
LONGTMR(1200) SCYEXIT( )
CONNAME(NODE(1414)) MREXIT( )
MREXIT( ) CONNAME2(SOME(1416))
TPNAME( ) BATCHSZ(50)
MCANAME( ) MODENAME( )
ALTTIME(00.41.56) SSLPEER()
CONTRIVED() ATTR (00-41-56)
CONTRIVED() DOCTORED()
MSGEXIT( )
У меня есть следующий код Perl для захвата каждой пары атрибут / значение.
Код Perl
my $resplit = qr/\s+([^\s]+(?:\([^)]*\))?)\s?/;
while ( <IN2> )
{ s/[\s\r\n]+$//;
if ( m/^\s(?:$resplit)(?:$resplit)?$/ )
{ my ($one,$two) = ($1,$2);
print "one: $one, two: $two\n";
}
}
Вот вывод, когда вышеуказанный код применяется к вводу образца:
one: CHANNEL(TO.IPTWX01), two: CHLTYPE(CLUSRCVR)
one: DISCINT(6000), two: SHORTRTY(10)
one: TRPTYPE(TCP), two: DESCR( )
one: LONGTMR(1200), two: SCYEXIT( )
one: CONNAME(NODE(1414)), two: MREXIT( )
one: MREXIT( ), two: CONNAME2(SOME(1416))
one: TPNAME( ), two: BATCHSZ(50)
one: MCANAME( ), two: MODENAME( )
one: ALTTIME(00.41.56), two: SSLPEER()
one: CONTRIVED(), two: ATTR(00-41-56)
one: CONTRIVED(), two: DOCTORED()
one: MSGEXIT(, two: )
Это прекрасно работает, за исключением последней строки в выводе
выше. Я действительно изо всех сил пытаюсь выяснить, как
чтобы изменить вышеприведенное выражение $ resplit, чтобы захватить последний случай.
Может кто-нибудь предложить какие-либо идеи / предложения о том, как сделать эту работу или
другой подход?