Perl:将文件的每一行与该文件的每一行进行比较

时间:2014-04-16 06:55:33

标签: perl loops io while-loop

我是Perl的新手并且需要一些听起来很简单的东西 - 但不知道该怎么做!

我有一个充满随机长度字符串的文件(每行一个),并且使用Needleman-Wunsch算法的修改版本来估计属于[ACTG] *的字符串的最长公共子序列的预期长度。

为了做出这样的估计,我应该将文件中的每个字符串与文件中的每个其他字符串进行比较。

我想到这样的事情:

open IN "filename";
while (my $line1 = <IN>) {
  defined (my $line2 = <IN>) or last;
  #Needleman-Wunsch comparison
  #add each comparison result to a total
}
#compute average and output to file down here

会起作用 - 但我不确定这是否正确。我认为这只会一次读取文件的两行而不是以嵌套方式遍历文件。时间复杂性并不是一个真正的问题,所以不要过于关注它。

2 个答案:

答案 0 :(得分:0)

你需要将整个文件啜饮到内存中

use strict;
use warnings;
use autodie;

open my $fh, '<', "filename";
my @lines = <$fh>;

for my $i (0..$#lines) {
    for my $j (0..$#lines) {
        #Needleman-Wunsch comparison
        #add each comparison result to a total
    }
}

或打开同一文件的两个文件句柄:

use strict;
use warnings;
use autodie;

use Fcntl;

open my $fh1, '<', "filename";
open my $fh2, '<', "filename";

while (<$fh1>) {
    seek($fh2, 0, SEEK_SET); # Rewind fh
    while (<$fh2>) {
        #Needleman-Wunsch comparison
        #add each comparison result to a total
    }
}

答案 1 :(得分:0)

考虑使用和研究Algorithm::NeedlemanWunschBio::Tools::dpAlign

的代码