Perl正则表达式跳过其他所有行

时间:2012-07-19 15:57:47

标签: regex perl

我试图从文本文件中提取每行的第一个完整数字,如下所示:

8 gcaggcaaactgcgataataaaaggctgtttcaacagcggagtggattgt 1.5307684822361e-176
11 tttacccagtgagtttgaagcaaggatcttttagtttaccgaaaaatgag 3.22210306380202e-293
14 agcaatagcgcgaacagacaacctcatcagtctaccgcgcaccctttccc 1.32107737963584e-52
20 agtgacagggaaaggcgatcgcggctttacgatcagagatcggtgtcggt 0.942504155078175
30 tccggagactttcgattgcatgcaattcaccatcataccctcttgccctc 0
45 actgagcccctgacgctggccagtgtagcgctgtgaagtcccctctcagg 9.49147409471272e-307
53 gaaccgagcgatcgctgctgccattgtctcgccttctgccgaggaatgcc 2.15850303270505e-28

使用以下代码中的正则表达式:

my $id = undef;
while (my $line = <INFILE>){
  chomp $line;
  if ($line =~ /\A([0-9]+)/){
      $id = $1;
  }
print OUTFILE "$id\n";
$line = <INFILE>;
chomp $line;
}

我得到的输出只包括其他每一行:

8
14
30
53

我已经尝试打印出每一行而不进行匹配,一切都在那里。一旦我添加了正则表达式,它就会跳过其他所有行。任何想法为什么这样做?

2 个答案:

答案 0 :(得分:4)

您正在阅读INFILE句柄两次,一次是在while条件下,一次是在循环结束时。

删除,最后阅读:

my $id = undef;
while (my $line = <INFILE>){
  chomp $line;
  if ($line =~ /\A([0-9]+)/){
      $id = $1;
  }
  print OUTFILE "$id\n";
}

答案 1 :(得分:1)

您正在跳过文件行

   while (my $line = <INFILE>) {   # Reading line once
       chomp $line;   
       if ($line =~ /\A([0-9]+)/){       
          $id = $1;   
       } 
       print OUTFILE "$id\n";
       $line = <INFILE>;   # Reading line again!!!!!

   }

因为你正在打电话

   $line = <INFILE>; 

两次。您无需在代码中使用第二个$line = <INFILE>