【问题标题】:Hash in hashes perl code issue哈希中的哈希 perl 代码问题
【发布时间】:2017-04-25 09:20:24
【问题描述】:

我尝试使用 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 设置为 global 仍然无济于事,此代码仍然存在错误。

我的代码输出:

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 有时在您的正则表达式中不匹配。

标签: regex perl ibm-mq


【解决方案1】:

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

【讨论】:

  • @Downvoter:请解释一下,我可以改进我的答案
猜你喜欢
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 2023-04-07
  • 2013-12-20
相关资源
最近更新 更多