gra*_*tas 8 database perl hash berkeley-db
我有一个使用散列的脚本,它包含四个字符串作为键,其值为哈希值.这些哈希值还包含四个字符串作为键,它们也具有哈希值作为其值.此模式持续高达n-1级别,这是在运行时确定的.第n级哈希包含整数(与通常的哈希引用相对)值.
我为Perl安装了BerkeleyDB模块,因此我可以使用磁盘空间而不是RAM来存储此哈希.我假设我可以简单地将哈希绑定到数据库,它会工作,所以我在我的代码中添加了以下内容:
my %tags = () ;
my $file = "db_tags.db" ;
unlink $file;
tie %tags, "BerkeleyDB::Hash",
-Filename => $file,
-Flags => DB_CREATE
or die "Cannot open $file\n" ;
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误:
在getUniqSubTreeBDB.pl第31行第1行使用"strict refs"时,不能使用字符串("HASH(0x1a69ad8)")作为HASH引用.
为了测试,我创建了一个新脚本,其代码(上面)与哈希绑定到文件.然后我添加了以下内容:
my $href = \%tags;
$tags{'C'} = {} ;
Run Code Online (Sandbox Code Playgroud)
它运行正常.然后我补充说:
$tags{'C'}->{'G'} = {} ;
Run Code Online (Sandbox Code Playgroud)
它会给出几乎相同的错误.我在想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";
Run Code Online (Sandbox Code Playgroud)
我昨天提供的代码可以正常使用.
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;
Run Code Online (Sandbox Code Playgroud)