我正在尝试使用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
当我运行它时,我得到:在连接中使用未初始化的值(.)或位于./test_hashes.pl第8行、第2行的字符串。
有什么建议吗?提前感谢
发布于 2014-06-04 22:50:31
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";
}同时,我将向模块的作者提及这一点,希望在不久的将来得到修复。
https://stackoverflow.com/questions/24039607
复制相似问题