【发布时间】:2021-02-27 22:07:07
【问题描述】:
我没有经验,也不太擅长编写代码,而且我已经在这个问题上停留了一段时间。我之前搜索过stackoverflow,但找不到任何与我的问题相匹配的东西,所以想尝试通过这种方式获得一些帮助。
我想构建一个脚本来分析某个命令的文本输出并将其放入哈希数组中,这样我就可以用它来做一些事情了。
我有这样的文本输出:
1 : DISPLAY AUTHREC GROUP('GROUP1')
AMQ8864I: Display authority record details.
PROFILE(SYSTEM.ADMIN.COMMAND.QUEUE) ENTITY(GROUP1)
ENTTYPE(GROUP) OBJTYPE(QUEUE)
AUTHLIST(BROWSE,CHG,CLR,DLT,DSP,GET,INQ,PUT)
AMQ8864I: Display authority record details.
PROFILE(SYSTEM.MQEXPLORER.REPLY.MODEL)
ENTITY(GROUP1) ENTTYPE(GROUP)
OBJTYPE(QUEUE)
AUTHLIST(BROWSE,CHG,CLR,DLT,DSP,GET,INQ,PUT)
AMQ8864I: Display authority record details.
PROFILE(self) ENTITY(GROUP1)
ENTTYPE(GROUP) OBJTYPE(QMGR)
AUTHLIST(ALTUSR,CHG,CONNECT,DLT,DSP,INQ,SET)
我想将每条记录存储为散列数组中的散列。 这就是我目前的做法(请不要对我写这篇文章的方式持否定态度,可能有 100 种更好的方法可以做到这一点,但我仍在学习,所以请记住这一点,欢迎提出改进建议):
my @authrecs;
my @authrecoutput; #this array contains the text output as displayed above, each line in a different element.
my $len = @authrecoutput;
for (my $i = 0; $i <= $len; $i++){
if(@authrecoutput[$i] =~ /^AMQ8864I/) #when the eventcode occurs i start creating a new hash and store all properties in it.
{
my $rec = {};
while (@authrecoutput[$i+1] =~ /(\S+)\((.+?)\)/g ){
$rec->{$1} = $2;
}
while (@authrecoutput[$i+2] =~ /(\S+)\((.+?)\)/g ){
$rec->{$1} = $2;
}
while (@authrecoutput[$i+3] =~ /(\S+)\((.+?)\)/g ){ #problem with this that now the script only looks at $i+3 lines so anything on $1+4 i will miss.
$rec->{$1} = $2;
}
push @authrecs, $rec;
}
}
print Dumper @authrecs;
我的输出:
$VAR1 = {
'AUTHLIST' => 'BROWSE,CHG,CLR,DLT,DSP,GET,INQ,PUT,PASSALL,PASSID,SET,SETALL,SETID',
'ENTTYPE' => 'GROUP',
'ENTITY' => 'GROUP1',
'OBJTYPE' => 'QUEUE',
'PROFILE' => 'SYSTEM.ADMIN.COMMAND.QUEUE'
};
$VAR2 = {
'PROFILE' => 'SYSTEM.MQEXPLORER.REPLY.MODEL',
'ENTITY' => 'GROUP1',
'OBJTYPE' => 'QUEUE',
'ENTTYPE' => 'GROUP'
};
$VAR3 = {
'PROFILE' => 'self',
'OBJTYPE' => 'QMGR',
'ENTITY' => 'GROUP1',
'ENTTYPE' => 'GROUP',
'AUTHLIST' => 'ALTUSR,CHG,CONNECT,DLT,DSP,INQ,SET,SETALL,SETID,CTRL,SYSTEM'
};
这可行,但问题是在数组中查找属性不是动态的,并且设置为@authrecoutput[$i+3] 的固定长度。例如,'SYSTEM.MQEXPLORER.REPLY.MODEL' 配置文件在文本输出中有 4 行,而包含 'AUTHLIST' 属性的第四行显然没有被捕获。
我尝试嵌套第二个 for 循环,当事件代码 AMQ8864I 再次发生时会中断(因为那是我知道正在显示新记录的时候)但我没有找到如何在正则表达式条件下中断 for 循环,如果那样的话甚至是一件事。
我怎样才能将其编码为更加动态并读取行,直到检测到下一次出现“AMQ8864I”。
【问题讨论】:
标签: arrays perl for-loop dynamic hash