这并没有按照您的想法进行:
chomp (my @ref1 = <$fh>);
my %hash = @ref1;
在这里转置键/值并没有什么魔力——所以你要做的就是得到一个如下所示的哈希值:
'2 C ' => '2 HZ',
'ID1 ID2' => '1 HZ',
'1 HX' => '1 HY',
'2 N' => undef
我打赌那不是你想要的。
我怀疑你可能想要的是:
my %ref1;
while ( <$input> ) {
chomp;
my ( $key, $value ) = split;
push ( @{$ref1{$key}}, $value );
}
print Dumper \%ref1;
您还将打开文件以便在第二个循环中进行写入。您可能也不想这样做。
我会选择类似的东西:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $ref1 = 'ref1.txt';
my $input_path = '/path/';
open my $ref1_fh, '<', $ref1 or die "Can't read $ref1: $!";
my %ref1;
while (<$ref1_fh>) {
chomp;
next if m/ID/;
my ( $key, $value ) = split;
my $zeropadded = sprintf( "%03d", $key );
my ($firstletter) = ( $value =~ m/^(\w)/ );
push( @{ $ref1{$zeropadded}{$firstletter} }, $value );
}
print Dumper \%ref1;
print join( "\t", "ID1", "ID2", "ID3" ), "\n";
foreach my $filename ( glob("number*.txt") ) {
my ($ref_num) = ( $filename =~ m/number(\d+)/ );
open( my $input, "<", $filename ) or warn $!;
while (<$input>) {
chomp;
my ( $key, $value ) = split;
my ($firstletter) = ( $key =~ m/^(\w)/ );
if ( defined $ref1{$ref_num}{$firstletter}
and @{ $ref1{$ref_num}{$firstletter} } )
{
my $refkey = pop( @{ $ref1{$ref_num}{$firstletter} } );
print join( "\t", int $ref_num, $refkey, $value ), "\n";
}
}
close($input);
}
我已将“ref”数字转换为零填充,因此它直接匹配文件名,因为您指定的文件名是number001.txt
匹配1
in ref1
.
我还要插入以下内容$ref1
进入数组的哈希值,键入您要查找的第一个字母 - 弹出“查找”值直到为空。
因此我们得到:
ID1 ID2 ID3
1 HY 5
1 HX 4
1 HZ 7
2 C 9
2 HZ 11
2 N 0