perl - 如何在 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
为什么会出现此警告,我该如何摆脱它?
解决方案
我认为这实际上是您指出的问题的一种表现。的文档是tie()
这样说的:
构造函数返回的对象也由 tie 函数返回
所以你$ok
包含对对象的引用,你应该在调用之前取消定义它untie()
。
undef $ok;
untie %db;
推荐阅读
- c# - 在 UnitTest 中使用 Moq 模拟 PostAsync 和其他方法
- angular - Angular Material Datepicker 国际化示例不起作用
- android - 如何在运行 gradle 命令“android”(javafxports)时解决错误“java.lang.NoClassDefFoundError: android/app/Activity”?
- php - 将 JSON 发送到数据表给我参数错误
- r - 如何使用 TDA 包为固定半径构建 alpha 形状复合体?
- intellij-idea - Intellij 覆盖构造函数快捷键
- python - 简化代码。我的工作,但看起来像地狱一样丑陋
- jquery - jquery focus() 对输入不起作用,试图检查是否点击了输入,等待输入,或者没有
- c# - LINQ 表达式 'DbSet
\n .Where(c => __res_RelatedContacts_0\n.Any(r => r.IdVal.Equals(c.ContactId)))' 无法翻译 - bokeh - 散景:无法从存储在 CDSView 中的数组中渲染线条(jupyter notebook,来自 Pandas 数据框的 CDS)