我正在尝试将文件的内容与哈希值进行比较。为此,我正在使用map
,if
和exists
,尽管效果不佳。
基本上,我想知道文件的第 0 到 2 列是否存在于 hash中。如果是这样,那么我想查找第 3 列是否作为键存在于内部 hash中。我的“旧文件.txt”是一个制表符分隔的文件,我从中生成以下哈希:
旧文件.txt:
A s.av u
B s.bv u
C s.av u
C s.cv m
哈希:
my %oldhash = {
'A' => {'s.av' => ['u']},
'B' => {'s.bv' => ['u']},
'C' => {'s.av' => ['u'], 's.cv' => ['m']},
};
查看“new file.txt”中的以下制表符分隔的列是否存在于哈希中:
D Db Dc s.av #cols 0 - 2 do not exist in hash
E A Ab d.ef #column 1 exists, but column 3 doesn't, so nothing is done
E A Ac s.av #col 1 and 3 exist, so the new file will have the value of $oldhash{A}{s.av}
B Bb B s.bv #col0 and 3 exist, so I'll include the value of $oldhash{B}{s.bv}
请注意,列 0 和 2 都存在于散列中,但这并不重要,因为我只需要其中一列存在。
输出可以与带有添加列的测试文件完全相同,该列u
取自m
另一个文件。例子:
D Db Dc s.av #inserts empty column
E A Ab d.ef #inserts empty column
E A Ac s.av u #with u inserted
B Bb B s.bv u #with u inserted
这是我到目前为止的地方,但我得到了exists argument is not a HASH or ARRAY element or a subroutine at myfile.pl line 24
:
#!/usr/local/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $dir='D:\\';
open my $oldfile, "<", "$dir\\old file.txt";
open my $newfile, "<", "$dir\\new file.txt";
my (%oldhash);
# creates the hash of hashes
while (my $odata = <$oldfile>){
chomp $odata;
my @oline = split /\t/, lc $odata;
push @{$oldhash{$oline[1]}{$oline[2]}}, $oline[3];
}
# does the comparison between the file and the hash
while (my $newlines = <$newfile>){
chomp $newlines;
my @line = split /\t/, $newlines;
if (exists map {$oldhash{$_}} @line[0..2]) {
print $oldhash{$_};
}
}
close $updatedtax;
close $oldtax;
我很感激你能给我的所有帮助!先感谢您