2012-09-16 256 views
0

我的數據看起來像Perl的正則表達式

NC_004415 NC_010199 ([T(trnH ,trnS1 trnL1 ,)]) 
NC_006131 NC_010199 ([T(trnH ,trnS1 trnL1 ,)]) 
NC_006355 NC_007231 ([T(trnM ,trnQ ,)]) 

我想捕捉[]之間的一切;

while(my $line = <crex>) 

{ $t=$line=~m/(\[.*\])/; 

    print $t; 
} 
    } 

$ t的輸出是1!爲什麼它不工作

+0

我不能幫助perl,但你的表情很好。問題在於你的代碼。 –

+0

另外,你有一個額外的尾隨大括號。 – nneonneo

回答

3

,你可以只使用$1匹配成功後:

if($line =~ m/(\[.*\])/) 
    print $1; 
2

$line =~ m/(\[.*\])/返回匹配的列表列表上下文,但是你在標量上下文中使用它。在標量上下文中,匹配運算符返回一個布爾值,指示匹配是否成功。因此你得到1。您可以使用

my ($t) = $line =~ m/(\[.*\])/; 

創建一個列表環境,也可以使用$1而不是使用$t

+0

並非如此。 '=〜'在列表上下文中返回一個數組*,這裏不是這種情況。 'print'在OP的代碼中的無效上下文中被調用,並且不強制對數組參數進行標量解釋 - 並且這些都沒有。除非有'@ t',否則OP不能「嘗試'$ t [0]'」。 – pilcrow

+0

@pilcrow現在看起來不錯吧?除了閱讀「學習Perl」的前幾章以外,我沒有太多的經驗。 – quantum

+0

@pilcrow。它永遠不會返回一個數組。無法返回數組。只有標量列表可以被返回。 – ikegami