我有一个这样的表有3列,名为table1
1 2 A
2 3 B
4 5 D
我有另一个包含一列的表,名为table2,看起来像这样
A
B
E
F
如果table1和table1的第三列之间存在匹配,我想将匹配行原样打印到名为output的新表中,在这种情况下应该看起来像这样
1 2 A
2 3 B
我在Perl中写作并认为我应该使用哈希来做这件事。所以我尝试了以下
#!/usr/bin/perl
use strict;
use warnings;
open(my $table1,'<',"table1.txt");
open(my $table2,'<',"table2.txt");
open(my $output,'+>',"output.txt");
my %hash = ();
while (<$table2>){
chomp;
my $keyfield = $_;
push @{$hash{keyfield}};
}
seek $table1,0,0;
while (<$table1>){
chomp;
my @cols = split(/\t/);
my $keyfield = $cols[2];
if (exists($hash{$keyfield})) {
print $output $_, "\n";
}
}
此方法之前有效,但现在我不得不稍微修改它。我收到警告:在第13行没有使用push的无用(这是我推送的行)。我的输出是空的。 我做错了什么?
答案 0 :(得分:3)
您需要使用$hash{$keyfield} = 1
来创建关联,而不是push
。
每tip from @Sobrique,您还可以使用$hash{$keyfield}++
,以便稍后确定密钥是否存在,并为您提供一些事件。