变量包含perl

时间:2017-04-26 07:30:14

标签: regex perl undefined-behavior removing-whitespace

我的文件包含:

AMQ8409: Display Queue details.
   QUEUE(SYSTEM.DATATYPE.REPLY.QUEUE)      TYPE(QLOCAL)
   ACCTQ(QMGR)                             ALTDATE(2016-08-01)
   ALTTIME(18.33.20)                       BOQNAME( )

AMQ8409: Display Queue details.
   QUEUE(SYSTEM.DATATYPE.REQUEST.QUEUE)    TYPE(QLOCAL)
   ACCTQ(QMGR)                             ALTDATE(2016-08-01)
   ALTTIME(18.32.37)                       BOQNAME( )

AMQ8409: Display Queue details.
   QUEUE(SYSTEM.MESSAGE.ASSOCIATION.QUEUE)
   TYPE(QLOCAL)                            ACCTQ(QMGR)
   ALTDATE(2016-08-01)                     ALTTIME(18.32.37)

AMQ8409: Display Queue details.
   QUEUE(SYSTEM.PENDING.DATATYPE.REPLY)        TYPE(QLOCAL)
   ACCTQ(QMGR)                             ALTDATE(2016-08-01)
   ALTTIME(18.33.20)                       BOQNAME( )

我想从QUEUE选项中提取数据,假设输出如下,

SYSTEM.DATATYPE.REPLY.QUEUE 
SYSTEM.DATATYPE.REQUEST.QUEUE 
SYSTEM.MESSAGE.ASSOCIATION.QUEUE
SYSTEM.PENDING.DATATYPE.REPLY

我编写了一个代码来获取此输出,

use warnings;
use strict;

open (CHS_OUT, "cat test.txt|");
while (<CHS_OUT>) {

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

        print "$QName \n";

}

然而,收到以下警告,

  

在连接(。)或字符串中使用未初始化的值$ QName   test_str.pl第19行,第1行.SYSTEM.DATATYPE.REPLY.QUEUE   在连接(。)或字符串中使用未初始化的值$ QName   test_str.pl第19行,第3行。使用未初始化的值   串联(。)中的$ QName或test_str.pl第19行的字符串,    第4行。在连接中使用未初始化的值$ QName   (。)或test_str.pl第19行,第5行的字符串。使用   uninitialized值$ QName连接(。)或字符串at   test_str.pl第19行,第6行.SYSTEM.DATATYPE.REQUEST.QUEUE   在连接(。)或字符串中使用未初始化的值$ QName   test_str.pl第19行,第8行。使用未初始化的值   串联(。)中的$ QName或test_str.pl第19行的字符串,    第9行。在连接中使用未初始化的值$ QName   (。)或test_str.pl第19行,第10行的字符串   uninitialized值$ QName连接(。)或字符串at   test_str.pl第19行,第11行。
  SYSTEM.MESSAGE.ASSOCIATION.QUEUE使用未初始化的值$ QName in   连接(。)或字符串在test_str.pl第19行,第13行。   在连接(。)或字符串中使用未初始化的值$ QName   test_str.pl第19行,第14行。使用未初始化的值   串联(。)中的$ QName或test_str.pl第19行的字符串,    第15行。使用未初始化的值$ QName in   连接(。)或字符串在test_str.pl第19行,第16行。   SYSTEM.PENDING.DATATYPE.REPLY在中使用未初始化的值$ QName   在test_str.pl第19行第18行连接(。)或字符串。   在连接(。)或字符串中使用未初始化的值$ QName   test_str.pl第19行,第19行。

如果我在代码中移除了use strictuse warnings,它就会成功,但是值下方有多个空格,输出如下,

SYSTEM.DATATYPE.REPLY.QUEUE 




SYSTEM.DATATYPE.REQUEST.QUEUE 




SYSTEM.MESSAGE.ASSOCIATION.QUEUE 




SYSTEM.PENDING.DATATYPE.REPLY 

这个输出不是我想要的,因为它在值下面有多个空白行,这个空格perl假设为undef值。

我想输出如下,每行没有空格,

SYSTEM.DATATYPE.REPLY.QUEUE 
SYSTEM.DATATYPE.REQUEST.QUEUE 
SYSTEM.MESSAGE.ASSOCIATION.QUEUE
SYSTEM.PENDING.DATATYPE.REPLY

我是否有可能使用next使perl忽略处理undef值?

1 个答案:

答案 0 :(得分:0)

对于不包含“Queue(”)的每一行,都会得到这个未定义的消息。 所以你必须检查一下:

while (<CHS_OUT>) {
        my ($QName) = /QUEUE\(([^()]+)\)/;
        if ($QName){ 
           print "$QName \n";
        }
}