-1

各レコードには 4 行あります。

次のように:

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

1 つのファイルが他のファイルに対応する 2 つのファイルがあります。

シーケンスの配列 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

同じ番号の行だけが一致する可能性がある場合、実際には複数のループは必要ありません。読み取り操作 ( <>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";
   }
}
于 2012-06-05T15:05:29.373 に答える
1

あなたの文から、シーケンスが2番目に収集したシーケンスと一致するかどうかを確認する必要があります.2つのファイルの行が一致するかどうかを確認したいですか?

ファイルを数回読み取る必要がある場合は、 を使用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;
    }
  }
}

編集

あなたのコメントは問題を変えました。どちらのファイルにも 4 行のレコードがあり、2 つのファイルの対応するレコードの 2 行目を比較したいと考えています。

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 に答える