我试图使用BerkeleyDB将绑定的哈希传递给子例程并在例程中修改数据库的内容,但它无法正常工作。
#!/usr/bin/perl
use warnings;
use strict;
use BerkeleyDB;
sub testdb($)
{
my $dbptr = shift;
my %db = %{$dbptr};
print("inside foo: ", $db{'foo'}, "\n");
$db{'biz'} = "baz";
return 0;
}
my %database;
my $dbhand = tie %database, 'BerkeleyDB::Hash', -Filename => "test.db";
print "outside foo: ", $database{'foo'}, "\n";
testdb(\%database);
print "returned: ", $database{'biz'}, "\n";
$dbhand->db_close();
undef($dbhand);
untie %database;
exit(0);
但是当我运行它时:
./dbtie
outside foo: foobar
inside foo: foobar
Use of uninitialized value in print at ./dbtie line 24.
returned:
所以看来我可以从数据库中读取,但我无法写入。为什么?
我尝试在子例程结束时执行db_sync(),但没有区别。
这是使用BerkeleyDB版本0.54的Perl 5.14。它反过来使用Berkeley DB版本6,创建版本9哈希表。
答案 0 :(得分:1)
不要在您的子资源中取消引用您的绑定哈希值。而是使用参考:
sub testdb
{
my $dbptr = shift;
print("inside foo: ", $dbptr->{'foo'}, "\n");
$dbptr->{'biz'} = "baz";
return 0;
}
分配my %hash = %$dbptr
时,您需要创建所有数据的副本并将其分配给新的基本哈希数据结构。子例程退出后,您对%hash
所做的任何更改都将丢失,除非您故意对其执行某些操作。