试图理解perl中的'if ... else'循环

时间:2015-01-22 01:08:46

标签: perl

编程和测试一些perl脚本的新手。 两组数据和任务是根据它们的相似性或缺乏性将它们分成两个不同的箱。

set 1 
chr1 122 
chr1 123 
chr2 223 
chr2 224

set2 
chr1 122 abc 
chr1 125 def 
chr2 223 ghi 
chr2 225 jkl

我写的剧本如下。我的问题是,@same显示预期的输出(在第1组和第2组之间包含相同信息的行),@diff显示完全不可理解的内容。我误解了if ... else的用法吗?任何见解将不胜感激!

#! usr/bin/perl
use warnings;
use strict;
open FH1, "comp1.txt" or die $!;
open FH2, "comp2.txt" or die $!;
my ($v1_col1, $v1_col2);
my ($v2_col1, $v2_col2, $v2_col3);
my (@diff, @same);

while (<FH1>) {
    ($v1_col1, $v1_col2) = split /\t/, $_;
    seek FH2, 0, 0;  
    while (<FH2>) {
        ($v2_col1, $v2_col2, $v2_col3) = split /\t/, $_;
        if ($v1_col2 == $v2_col2) {
            push @same, $_;
        } else {
            push @diff, $_;
        }
    }
}
print @same, "\n";

1 个答案:

答案 0 :(得分:0)

这种情况正在发生:

  • 读取set1的第一行
    • 阅读第2组的第一行 将chr1 122chr1 122 abc进行比较。被认为是平等的 - &gt; chr1 122 abc去了 到@same
    • 阅读第2组第2行 将chr1 122chr1 125 def进行比较。认为不平等 - &gt; chr1 125 def 转到@diff
    • 阅读第3组第3行 将chr1 122chr2 223 ghi进行比较。认为不平等 - &gt; chr2 223 ghi 转到@diff

等等。现在的问题是chr2 223 ghichr1 122不相等,但您希望它在集合1中等于chr2 223

所以,你必须先填写@same。然后使用@diff中未找到的值填充@same