2012-09-16 207 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