gpt4 book ai didi

database - perl 中的 BerkeleyDB 可以处理哈希的哈希(最多 n 个)吗?

转载 作者:太空狗 更新时间:2023-10-30 01:45:29 33 4
gpt4 key购买 nike

我有一个使用散列的脚本,它包含四个字符串作为键,其值是散列。这些散列还包含四个字符串作为键,它们也有散列作为它们的值。这种模式一直持续到 n-1 级,这是在运行时确定的。第 n 级散列包含整数(与通常的散列引用相反)值。

我为 Perl 安装了 BerkeleyDB 模块,所以我可以使用磁盘空间而不是 RAM 来存储这个散列。我假设我可以简单地将散列绑定(bind)到数据库,并且它会起作用,所以我将以下内容添加到我的代码中:

my %tags = () ; 
my $file = "db_tags.db" ;
unlink $file;


tie %tags, "BerkeleyDB::Hash",
-Filename => $file,
-Flags => DB_CREATE
or die "Cannot open $file\n" ;

但是,我得到了错误:

在 getUniqSubTreeBDB.pl 第 31 行第 1 行使用“严格引用”时,不能使用字符串(“HASH(0x1a69ad8)”)作为 HASH 引用。

为了测试,我创建了一个新脚本,其中的代码(如上)绑定(bind)到一个文件的散列。然后我添加了以下内容:

my $href = \%tags; 
$tags{'C'} = {} ;

它运行良好。然后我补充说:

$tags{'C'}->{'G'} = {} ;

它会给出几乎相同的错误。我认为 BerkeleyDB 无法处理我正在创建的数据结构类型。也许它能够处理我测试中的第一级 (C->{}),因为它只是一个常规键 -> 缩放器?

无论如何,如果您对我的假设有任何建议或肯定,我们将不胜感激。

最佳答案

使用DBM::Deep .

my $db = DBM::Deep->new( "foo.db" );

$db->{mykey} = "myvalue";
$db->{myhash} = {};
$db->{myhash}->{subkey} = "subvalue";

print $db->{myhash}->{subkey} . "\n";

我昨天提供的代码可以很好地处理这个问题。

sub get_node {
my $p = \shift;
$p = \( ($$p)->{$_} ) for @_;
return $p;
}

my @seqs = qw( CG CA TT CG );

my $tree = DBM::Deep->new("foo.db");
++${ get_node($tree, split //) } for @seqs;

关于database - perl 中的 BerkeleyDB 可以处理哈希的哈希(最多 n 个)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9808789/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com