2017-04-25 100 views
1

我试图从下面的命令使用Perl代码存储信息,散列在散列Perl代码问题

DIS QL(*)所有的'|的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个),我写了一个代码来存储队列中,CURDEPTH和MAXDEPTH信息为每个MQ队列名称。

我的代码如下,

#!/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

看起来像某个时候'$ QName'没有在您正则表达式匹配。 – Jens

回答

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"; 
     } 
} 

OUTPUT:

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 
+0

@Downvoter:请解释,所以我可以改善我的答案 – Jens