Hash in hashes perl代码问题

时间:2017-04-25 09:20:25

标签: regex perl ibm-mq

我尝试使用perl代码

存储来自以下命令的信息
  

dis ql(*)all'| runmqsc MQ_NAME

假设此命令的输出如下,

AMQ8409: Display Queue details.
   QUEUE(SYSTEM.RETAINED.PUB.QUEUE)        TYPE(QLOCAL)
   ACCTQ(QMGR)                             ALTDATE(2016-08-01)
   ALTTIME(18.33.20)                       BOQNAME( )
   CLWLPRTY(0)                             CLWLRANK(0)
   CLWLUSEQ(QMGR)                          CRDATE(2016-08-01)
   CRTIME(18.32.37)                        CURDEPTH(2)
   MAXDEPTH(999999999)                     MAXMSGL(104857600)

AMQ8409: Display Queue details.
   QUEUE(SYSTEM.SELECTION.EVALUATION.QUEUE)
   TYPE(QLOCAL)                            ACCTQ(QMGR)
   ALTDATE(2016-08-01)                     ALTTIME(18.33.20)
   BOQNAME( )                              BOTHRESH(0)
   CLWLRANK(0)                             CLWLUSEQ(QMGR)
   CRDATE(2016-08-01)                      CRTIME(18.32.37)
   CURDEPTH(0)                             CUSTOM( )
   IPPROCS(0)                              MAXDEPTH(999999999)

AMQ8409: Display Queue details.
   QUEUE(SYSTEM.SELECTION.VALIDATION.QUEUE)
   TYPE(QLOCAL)                            ACCTQ(QMGR)
   ALTDATE(2016-08-01)                     ALTTIME(18.33.20)
   BOQNAME( )                              BOTHRESH(0)
   CLWLRANK(0)                             CLWLUSEQ(QMGR)
   CRDATE(2016-08-01)                      CRTIME(18.32.37)
   CURDEPTH(0)                             CUSTOM( )
   IPPROCS(0)                              MAXDEPTH(999999999)                       

因此,对于每个输出(从我们可以看到有3个),我编写了一个代码来存储有关每个MQ队列名称的QUEUE,CURDEPTH和MAXDEPTH的信息。

我的代码如下,

#!/usr/bin/perl

use warnings;
use strict;

my %QM;
my $qm = 'MQ_NAME';

open (CHS_OUT, "echo 'dis ql(*) all'|runmqsc $qm|");

while (<CHS_OUT>) {

        my ($QUEUE, $QName) = / ( QUEUE ) \( ( [^)]+ ) /x;

        if ( my ($item, $value)
        = / ( CURDEPTH | MAXDEPTH ) \( ( [^)]+ ) /x )
        {       
                $QM{$QName}{$item} = $value;
        }
}

foreach my $Que (sort keys %QM) {
        foreach my $v (keys %{ $QM{$Que} }) {
                print "$Que : $v = $QM{$Que}{$v} \n";
        }
}

我已经尝试将$ QName设为全局仍然无法帮助,此代码仍有错误。

我的代码输出:

Use of uninitialized value $QName in hash element at mq_queue_5.pl line 25, <CHS_OUT> line 7353.
Use of uninitialized value $QName in hash element at mq_queue_5.pl line 25, <CHS_OUT> line 7361.
Use of uninitialized value $QName in hash element at mq_queue_5.pl line 25, <CHS_OUT> line 7384.
Use of uninitialized value $QName in hash element at mq_queue_5.pl line 25, <CHS_OUT> line 7392.
 : CURDEPTH = 0 
 : MAXDEPTH = 999999999 

我已经停留了好几天,已经做了很多改变,但仍然没有帮助。

1 个答案:

答案 0 :(得分:3)

您必须检查QName是否匹配并记住它:

#!/usr/bin/perl

use warnings;
use strict;

my %QM;
my $qm = 'MQ_NAME';

open (CHS_OUT, "result.txt");
my $QName;
while (<CHS_OUT>) {
        my ($QUEUE, $QName1) = / ( QUEUE ) \( ( [^)]+ ) /x;

        if ($QName1) {
                $QName=$QName1;
        }
        if ( my ($item, $value)
        = / ( CURDEPTH | MAXDEPTH ) \( ( [^)]+ ) /x )
        {
                $QM{$QName}{$item} = $value;
        }
}

foreach my $Que (sort keys %QM) {
        foreach my $v (keys %{ $QM{$Que} }) {
                print "$Que : $v = $QM{$Que}{$v} \n";
        }
}

输出:

SYSTEM.RETAINED.PUB.QUEUE : CURDEPTH = 2
SYSTEM.RETAINED.PUB.QUEUE : MAXDEPTH = 999999999
SYSTEM.SELECTION.EVALUATION.QUEUE : CURDEPTH = 0
SYSTEM.SELECTION.EVALUATION.QUEUE : MAXDEPTH = 999999999
SYSTEM.SELECTION.VALIDATION.QUEUE : MAXDEPTH = 999999999
SYSTEM.SELECTION.VALIDATION.QUEUE : CURDEPTH = 0