gpt4 book ai didi

regex - 如何使用 Perl 解析 runmqsc 命令输出?

转载 作者:行者123 更新时间:2023-12-02 06:45:21 25 4
gpt4 key购买 nike

我正在尝试设计 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 以捕获最后一个案例。

任何人都可以就如何使这项工作或另一种方法?

最佳答案

Text::Balanced模块旨在处理此类问题。这种方法也可以处理任意数量的列。

use strict;
use warnings;
use Text::Balanced qw(extract_bracketed);

my ($extracted, $remainder, $prefix);
while ( defined($remainder = <DATA>) ){
while ( Get_paren_text() ){
$prefix =~ s/ //g;
print $prefix, $extracted, "\n";
}
}
sub Get_paren_text {
($extracted, $remainder, $prefix)
= extract_bracketed($remainder, '()', '[\w ]+');
return defined $extracted;
}

__DATA__
CHANNEL(TO.IPTWX01) CHLTYPE(CLUSRCVR) FOO( ( BAR) )
DISCINT(6000) SHORTRTY(10) BIZZ((((BUZZ) ) ) ) )
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( )

关于regex - 如何使用 Perl 解析 runmqsc 命令输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1336992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com