当表perl中有多个匹配值时,打印所有行

时间:2014-11-07 12:55:12

标签: regex perl

我有两个表:$ 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";
    }
}

2 个答案:

答案 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";
}
}