散列中的散列 perl 代码问题

Hash in hashes perl code issue

我尝试使用 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 

我已经卡了好几天了,已经做了很多改变,但仍然无济于事。

你必须检查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