首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tie::File::AsHash故障排除

Tie::File::AsHash故障排除
EN

Stack Overflow用户
提问于 2014-06-04 22:04:06
回答 1查看 131关注 0票数 0

我正在尝试使用Perls的Tie:: file ::AsHash将一个大文件加载到散列中。然而,它似乎得到了键,但没有得到值。代码是

代码语言:javascript
复制
#!/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行的字符串。

有什么建议吗?提前感谢

EN

回答 1

Stack Overflow用户

发布于 2014-06-04 22:50:31

Tie::Array::AsHash ( Tie::File::AsHash依赖于它)中存在一个错误,即文件中每一行的关键部分在正则表达式中按原样使用,以提取相应的值。这意味着如果键中出现任何正则表达式元字符,则不会找到该值。

您可以通过将Tie/Array/AsHash.pm的第59行从

代码语言:javascript
复制
my $fetchrx = qr/^$key$self->{split}(.*)/s;

代码语言:javascript
复制
my $split = $self->{split};
my $fetchrx = $split->isa('Regexp') ?
    qr/^\Q$key\E$split(.*)/s :
    qr/^\Q$key$split\E(.*)/s;

或者,除非您需要通过修改文件内容来反映散列中的更改的工具,否则您可以只编写如下代码

代码语言:javascript
复制
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";
}

同时,我将向模块的作者提及这一点,希望在不久的将来得到修复。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24039607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档