-1

每条记录有 4 行:

如下所示:

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

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

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

4

4 回答 4

1

如果您询问控制嵌套循环,您可以使用标签来做到这一点。

例子:

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

last例如参见。

于 2012-06-05T15:02:45.413 回答
1

如果只有相同编号的行可以匹配,您实际上不需要多个循环。您可以在任何地方调用读取操作 ( <>, read, sysread)。它通常只直接放在循环中,因为它方便地返回 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";
   }
}
于 2012-06-05T15:05:29.373 回答
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;
  }
}
于 2012-06-05T15:08:01.413 回答
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";
    }
}
于 2012-06-05T15:04:08.950 回答