Tie :: File :: AsHash故障排除

时间:2014-06-04 14:04:06

标签: perl perl-module text-parsing tie

我试图使用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行使用字符串。

有什么建议吗?提前致谢

1 个答案:

答案 0 :(得分:1)

Tie::Array::AsHashTie::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";
}

与此同时,我将向模块的作者提及这一点,以期在不久的将来修复它。