2012-06-05 49 views
-1

每個記錄有4行:Perl的while循環和讀取線

類似如下:

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

有兩個文件,其中1個文件對應於其他

有陣列的序列A1 因此,從文件1一次讀取1條記錄。從文件2讀取記錄。如果記錄1文件1(第2行)中的順序與數組A1中的順序匹配,我將記錄從文件2打印到輸出文件等......但重點是我需要在at處讀取記錄ime ....我將如何突破內部循環,以便我可以從文件1中讀取下一個記錄,然後將其與文件2中的下一個記錄進行比較

+0

我是否正確理解只有具有相同編號的行才能匹配所有文件? –

+0

什麼是內循環?這裏沒有內部循環afaics。 – Qtax

+0

你能解釋一下你的目標是什麼......你想比較這些文件嗎? – dgw

回答

1

如果詢問有關控制嵌套循環,您可以用標籤做。

實施例:

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

參見last例如。

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"; 
    } 
} 
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"; 
    } 
} 
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; 
    } 
} 
+0

對不起,沒有任何...我的意思如下: 每條記錄​​有4行..線1 isthe頭,第2行的序列,第3行是間隔物,第4行是一個字符串 讀取記錄1從文件1 提取線2 讀出記錄1從文件2 檢查如果序列是一個匹配 如果將它存儲在文件中 否則將其存儲在不匹配文件中 repeat(表示從文件1中讀取記錄2 ...) – A14