2017-04-26 147 views
-1

我對Perl很陌生。選擇要在perl中聲明的值

讓我們說從命令的輸出將是如下,

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() 

我打算存儲在隊列部分價值,它的值包含「DATATYPE」字,而不是包含「答覆」字,慾望輸出將是

SYSTEM.DATATYPE.REQUEST.QUEUE

我的代碼如下,

while (<OPEN_FILE>) { 
     my ($QName1) = /QUEUE\(([^()]+)\)/; 
     my ($QName1) = $QName1 =~ m/DATATYPE/ && $QName1 !~ m/RETRY/; 

     print "$QName1 \n"; 
} 

但是,上面的代碼失敗。

在上面的代碼之前,我嘗試聲明使用一行代碼,但沒有成功。

回答

0

你可以試試這個:

^\s*QUEUE\(\K(?=.*DATATYPE)(?!.*REPLY)[^\)]* 

Regex Demo

示例代碼:(Run it here

my $regex = qr/^\s*QUEUE\(\K(?=.*DATATYPE)(?!.*REPLY)[^\)]*/mp;  
if ($yourstring =~ /$regex/g) { 
    print ${^MATCH}; 
}