首页 > 解决方案 > 如何在 Perl 中使用 gdbm

问题描述

我是 gdbm 的新手,我想在 Perl 中使用它。我知道 Perl 默认附带一个模块(GDBM_File)。现在,当我尝试最简单的示例时,即:

#!/usr/bin/perl

use strict;
use warnings;

use GDBM_File;

my $dbfile = '/tmp/test.gdbm';

my $ok = tie(my %db, 'GDBM_File', $dbfile, &GDBM_WRCREAT, 0664);
die "can't tie to $dbfile for WRCREAT access: $!" unless $ok;

$db{test} = 1;

untie %db;

并执行它我收到以下警告:

untie attempted while 1 inner references still exist at ./gdbm-test line 13.

我阅读了perl 文档(请参阅提供的链接中的“untie gotcha”),但该解释似乎不适用于此处,因为很明显%db代码中没有任何引用指向它。

尽管如此,代码似乎仍然有效,因为当我检查数据库文件时,我得到了正确的结果:

bash$ echo list | gdbmtool /tmp/test.gdbm 
test 1

为什么会出现此警告,我该如何摆脱它?

标签: perlgdbm

解决方案


我认为这实际上是您指出的问题的一种表现。的文档是tie()这样说的:

构造函数返回的对象也由 tie 函数返回

所以你$ok包含对对象的引用,你应该在调用之前取消定义它untie()

undef $ok;
untie %db;

推荐阅读