我有两个表:$ conversion和$ table。在我的脚本中,我正在检查来自$ conversion的cols [5]和$ table中的cols [2]之间是否匹配,如果是这种情况我打印出$ conversion中另一列的值,即相应的值在cols [1]。
这一切都正常。
然而,来自$ convert的cols [5]中的某些值是相同的。如果是这种情况,我想打印当然所有匹配的$ convert。现在,他只打印了他在浏览文件时找到的最后一场比赛的相应值。因此,当来自$ conversion的cols [5]包含相同值的4倍时,在输出中仅打印第4个匹配的对应值。有关如何解决这个问题的任何提示?
这是我的剧本:
my %hash = ();
while (<$conversion>) {
chomp;
my @cols = split(/\t/);
my $keyfield = $cols[5];
my $keyfield2 = $cols[1];
$hash{$keyfield} = $keyfield2;
}
seek $table,0,0; #cursor resetting
while (<$table>) {
my @cols = split(/\t/);
my $keyfield = $cols[2];
if (exists($hash{$keyfield})) {
print $output "$cols[0]", "\t", "$hash{$keyfield}", "\t", "$cols[1]\n";
}
}
答案 0 :(得分:4)
不要存储单个$col[1]
,存储它们的整个数组:
push @{ $hash{$keyfield} }, $keyfield2;
打印时需要取消引用数组引用:
print $output "$cols[0]","\t","@{ $hash{$keyfield} }","\t","$cols[1]\n";
如果您想要唯一值,可以使用哈希而不是数组。
答案 1 :(得分:1)
my %hash = ();
while(<$conversion>){
chomp;
my @cols = split(/\t/);
my $keyfield = $cols[5];
my $keyfield2 = $cols[1];
push @$hash{$keyfield}, $keyfield2;
# $hash{$keyfield} = $keyfield2;
}
seek $table,0,0; #cursor resetting
while(<$table>){
my @cols = split(/\t/);
my $keyfield = $cols[2];
if (exists($hash{$keyfield})){
foreach(@$hash{$keyfield})
print $output "$cols[0]","\t","$_","\t","$cols[1]\n";
}
}