使用BerkelyDB将绑定的哈希传递给子例程

时间:2014-04-04 21:58:41

标签: perl subroutine berkeley-db tie

我试图使用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哈希表。

1 个答案:

答案 0 :(得分:1)

不要在您的子资源中取消引用您的绑定哈希值。而是使用参考:

sub testdb
{
    my $dbptr = shift;

    print("inside foo: ", $dbptr->{'foo'}, "\n");

    $dbptr->{'biz'} = "baz";
    return 0;
}

分配my %hash = %$dbptr时,您需要创建所有数据的副本并将其分配给新的基本哈希数据结构。子例程退出后,您对%hash所做的任何更改都将丢失,除非您故意对其执行某些操作。