如何在 Perl 中使用 gdbm
How to use gdbm in Perl
我是 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 documentation(参见所提供的 link 中的 "untie gotcha"),但该解释似乎不适用于此处,因为很明显 %db
具有代码中没有任何地方指向它。
尽管如此,代码似乎有效,因为当我检查数据库文件时,我得到了正确的结果:
bash$ echo list | gdbmtool /tmp/test.gdbm
test 1
为什么会出现这个警告,我该如何摆脱它?
我认为这实际上是您所指出的问题的体现。 documentation for tie()
表示:
The object returned by the constructor is also returned by the tie function
因此您的 $ok
包含对该对象的引用,您应该在调用 untie()
之前取消定义它。
undef $ok;
untie %db;
我是 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 documentation(参见所提供的 link 中的 "untie gotcha"),但该解释似乎不适用于此处,因为很明显 %db
具有代码中没有任何地方指向它。
尽管如此,代码似乎有效,因为当我检查数据库文件时,我得到了正确的结果:
bash$ echo list | gdbmtool /tmp/test.gdbm
test 1
为什么会出现这个警告,我该如何摆脱它?
我认为这实际上是您所指出的问题的体现。 documentation for tie()
表示:
The object returned by the constructor is also returned by the tie function
因此您的 $ok
包含对该对象的引用,您应该在调用 untie()
之前取消定义它。
undef $ok;
untie %db;