我试图使用Perls的Tie :: File :: AsHash将大文件加载到哈希中。但是,它似乎得到了键而不是值。代码是
#!/usr/bin/perl -w
use strict;
use Tie::File::AsHash;
tie my %what, 'Tie::File::AsHash', './test_tiehash', split => "\t" or die "Problem tying hash: $!";
foreach my $test(keys %what){
print "$test $what{$test}\n";
}
untie %what
我测试的文件只包含一行,最后一个数字后面有一个标签:
ENSMUSG00000020333 | ENSMUST00000000145 | 54361198 | 54361535 AGAACGTTGCGGGGCGGGCGGCCCAGCCCCTCCCCCAGTCGGGCTCGGCAGTTCGGATGCCGCTAGATTGCTCTCTCACTTCTGGAGAAGATGCAGACCCAGGAGATCCTGAGGATCCTGCGGCTGCCCGAGCTATCGGACTTGGGCCAGTTTTTCCGCAGCCTCTCAGCTACCACCCTCGACGGTGGTGGAGCCCGGCGATCTGTGATTGGGGGTTGCACT
当我运行它时,我得到: 在连接(。)中使用未初始化的值或在./test_hashes.pl第8行第2行使用字符串。
有什么建议吗?提前致谢
答案 0 :(得分:1)
Tie::Array::AsHash
(Tie::File::AsHash
所依赖的)中存在一个错误,其中文件中每行的键部分按原样用于正则表达式中提取相应的值。这意味着如果密钥中出现任何正则表达式元字符,则找不到该值。
您可以通过从
更改Tie/Array/AsHash.pm
的第59行来暂时解决此问题
my $fetchrx = qr/^$key$self->{split}(.*)/s;
到
my $split = $self->{split};
my $fetchrx = $split->isa('Regexp') ?
qr/^\Q$key\E$split(.*)/s :
qr/^\Q$key$split\E(.*)/s;
或者,除非您需要通过修改文件内容来反映哈希值更改的工具,否则您可以编写一些这样的代码
use strict;
use warnings;
use autodie;
my %what = do {
open my $fh, '<', 'test_tiehash.txt';
map { chomp; split /\t/; } <$fh>;
};
for my $test(keys %what){
print "$test $what{$test}\n";
}
与此同时,我将向模块的作者提及这一点,以期在不久的将来修复它。