Perl while循环和读取行

时间:2012-06-05 14:54:02

标签: perl diff

每条记录有4行:

如下所示:

@NCYC361­11a03.q1k bases 1 to 1576
GCGTGCCCGAAAAAATGCTTTTGGAGCCGCGCGTGAAAT
+
!)))))****(((***%%((((*(((+,**(((+**+,­

有两个文件,其中1个文件对应另一个

有一系列seqeunce A1 因此,从文件1一次读取1条记录。从文件2读取记录。如果记录1文件1(第2行)中的序列与数组A1中的seuqnece匹配,则将文件2中的记录打印到输出文件等等...但重点是我需要一次读取一条记录....我将如何突破内部循环,以便我可以从文件1中读取下一条记录,然后将其与下一条记录进行比较文件2

4 个答案:

答案 0 :(得分:1)

如果你问控制嵌套循环,你可以用标签来做。

示例:

OUTER:
while(<>){
    for(@something){
        last OUTER;
    }
}

例如,请参阅last

答案 1 :(得分:1)

如果只有相同数字的行匹配,则实际上不需要多个循环。您可以在任何地方呼叫阅读操作(<>readsysread)。它通常只直接放在循环中,因为它可以方便地返回undef并在工作完成后将其中断。

while(defined(my $first_line = <FIRST>)){
   my $second_line = <SECOND>;
   if($first_line eq $second_line){
      print "match\n";
   } else {
      print "no match\n";
   }
}

答案 2 :(得分:1)

从你的句子我需要检查序列是否与来自第二个的序列匹配,我想要检查两个文件中的任何行是否匹配?

如果您需要多次阅读文件,那么您可以使用seek快退到它的开头,而无需重新打开它。

这个程序显示了这个想法。

use strict;
use warnings;

open my $fh1, '<', 'file1' or die $!;
open my $fh2, '<', 'file2' or die $!;

open my $out, '>', 'matches' or die $!;

while (my $line1 = <$fh1>) {

  seek $fh2, 0, 0;

  while (my $line2 = <$fh2>) {

    if ($line1 eq $line2) {
      print $out $line1;
      last;
    }
  }
}

修改

您的评论改变了问题。这两个文件都有四行记录,您希望比较两个文件中相应记录中的第二行。

use strict;
use warnings;

open my $fh1, '<', 'file1' or die $!;
open my $fh2, '<', 'file2' or die $!;

open my $match, '>', 'matches' or die $!;
open my $nomatch, '>', 'nomatch' or die $!;

while (1) {

  my (@data1, @data2);

  for (1 .. 4) {
    my $line;
    $line = <$fh1>;
    push @data1, $line if defined $line;
    $line = <$fh2>;
    push @data2, $line if defined $line;
  }

  last unless @data1 == 4 and @data2 == 4;

  if ($data1[1] eq $data2[1]) {
    print $match @data2;
  }
  else {
    print $nomatch @data2;
  }
}

答案 3 :(得分:0)

一个完整的例子:

#!/usr/bin/env perl
use strict;
use warnings;

open F1, "<", "/path/1";
open F2, "<", "/path/2";

@a1 = <F1>;
@a2 = <F2>;

for (0..$#a1) {
    if ($a1[$_] eq $a2[$_]) {
        print "MATCH line [$_]\n";
    } else {
        print "DOESN'T MATCH line [$_]\n";
    }
}