试图理解';如果。。。其他';perl中的循环
编程新手,我正在测试一些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显示了一些完全不可理解的内容。如果。。。其他的?任何洞察都将不胜感激
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
goes 到chr1 122 abc
@相同的
- 阅读第2组的第2行
将
与chr1 122
进行比较。认为不平等->chr1 125 def
转到chr1 125 def
@diff
- 读取集合3的第三行
将
与chr1 122
进行比较。被认为不平等->chr2 223 ghi
转到chr2 223 ghi
@diff
- 读取集合2的第一行
chr2 223 ghi
与chr1 122
不相等,但您希望它与集合1中的chr2 223
相等
因此,您必须先填写相同的
。然后用@diff
中未找到的值填充@same
您正在将comp2.txt
中的每一行与comp1.txt
中的每一行进行比较。comp2.txt的第2行与comp1.txt的第1行不同,第3行、第4行等也不同。如果要比较每个文件的第1行,然后比较每个文件的第2行,依此类推,则不应使用嵌套循环。您应该有一个循环,从每个文件中读取一行并比较它们。如果
语句不是循环(它们不会导致代码重复执行);它们是流控制语句(它决定接下来执行什么代码)。