试图理解';如果。。。其他';perl中的循环

试图理解';如果。。。其他';perl中的循环,perl,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显示了一些完全不可理解的内容。如果。。。其他的?任何洞察都将不胜感激

编程新手,我正在测试一些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
显示了一些完全不可理解的内容。如果。。。其他的?任何洞察都将不胜感激

#! 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";
#!usr/bin/perl
使用警告;
严格使用;
打开FH1,“comp1.txt”或die$!;
打开FH2,“comp2.txt”或die$!;
我的($v1\u col1,$v1\u col2);
我的($v2\u col1,$v2\u col2,$v2\u col3);
我的(@diff,@same);
而(){
($v1\u col1,$v1\u col2)=拆分/\t/,$;
求FH2,0,0;
而(){
($v2\u col1,$v2\u col2,$v2\u col3)=拆分/\t/,$;
如果($v1\u col2==v2\u col2){
按@相同,$\;
}否则{
推送@diff,$\;
}
}
}
打印@same,“\n”;
这种情况正在发生:

  • 读取set1的第一行
    • 读取集合2的第一行
      chr1 122
      chr1 122 abc
      进行比较。被认为是平等的-->
      chr1 122 abc
      goes 到
      @相同的
    • 阅读第2组的第2行
      chr1 122
      chr1 125 def
      进行比较。认为不平等->
      chr1 125 def
      转到
      @diff
    • 读取集合3的第三行
      chr1 122
      chr2 223 ghi
      进行比较。被认为不平等->
      chr2 223 ghi
      转到
      @diff
等等。现在的问题是
chr2 223 ghi
chr1 122
不相等,但您希望它与集合1中的
chr2 223
相等


因此,您必须先填写相同的
。然后用
@diff
中未找到的值填充
@same

您正在将
comp2.txt
中的每一行与
comp1.txt
中的每一行进行比较。comp2.txt的第2行与comp1.txt的第1行不同,第3行、第4行等也不同。如果要比较每个文件的第1行,然后比较每个文件的第2行,依此类推,则不应使用嵌套循环。您应该有一个循环,从每个文件中读取一行并比较它们。
如果
语句不是循环(它们不会导致代码重复执行);它们是流控制语句(它决定接下来执行什么代码)。