在Perl中,如何读取符合条件的部分行?

时间:2009-07-11 20:04:54

标签: regex perl readline

示例数据:

603       Some garbage data not related to me, 55, 113 ->

1-ENST0000        This is sample data blh blah blah blahhhh
2-ENSBTAP0        This is also some other sample data
21-ENADT)$        DO NOT WANT TO READ THIS LINE. 
3-ENSGALP0        This is third sample data
node #4           This is 4th sample data
node #5           This is 5th sample data

This is also part of the input file but i dont wish to read this. 
Branch -> 05 13, 
      44, 1,1,4,1

17, 1150

637                   YYYYYY: 2 : %

编辑:在上面的数据中。列宽是固定的部分,但可能有一些我不想阅读的部分。上面的示例数据已经过编辑以反映出来。

因此,在这个输入文件中,我想将第一节'1-ENST0000'的内容读入一个数组,将'2-ENSBTAP0'的内容读入一个单独的数组,依此类推。

我无法想出一个定义模式的正则表达式...前三行有<someNumber>-ENS<someotherstuf>然后还有node #<some number here>

2 个答案:

答案 0 :(得分:1)

这真的是固定列文件吗?如果是这样,那么不要打扰正则表达式。只是在列宽处拆分,也许修剪columen 1中的尾随空格。

答案 1 :(得分:0)

好的,根据您之后的评论,这与上一个问题略有不同。此外,我现在意识到node #54是第一列中的有效条目。

更新:我现在也意识到你不需要第一列。

更新:通常,您既不想也不需要处理Perl中的字符数组。

更新:现在您已经明确了应该和不应该跳过的内容,这是一个处理该问题的版本。在if条件下添加模式。

#!/usr/bin/perl

use strict;
use warnings;

my @data;

while ( <DATA> ) {
    chomp;

    if ( /^[0-9]+-ENS.{5} +(.+)$/
            or /^node #[0-9]+ +(.+)$/
    ) {
        push @data, [ split //, $1 ];
    }
}

use Data::Dumper;
print Dumper \@data;

__DATA__
603       Some garbage data not related to me, 55, 113 ->

1-ENST0000        This is sample data blh blah blah blahhhh
2-ENSBTAP0        This is also some other sample data
21-ENADT)$        DO NOT WANT TO READ THIS LINE. 
3-ENSGALP0        This is third sample data
node #4           This is 4th sample data
node #5           This is 5th sample data

This is also part of the input file but i dont wish to read this. 
Branch -> 05 13, 
      44, 1,1,4,1

17, 1150

637                   YYYYYY: 2 : %

至于学习如何钓鱼,我建议你阅读perldoc perltoc中的所有相关内容。