GDBM_File 从较旧的 32 位 Perl 转换到 64 位 Perl 的互操作性问题

GDBM_File interoperability issue transitioning from older 32-bit Perl to 64-bit Perl

我有一些 GDBM 文件是使用旧的 32 位 (i686) 版本的 Perl (5.8.6) 创建的,我想与 x86_64 Perl 5.28.0 一起使用,但它没有工作。这是我的测试代码:

use strict;
use warnings;
use GDBM_File;

my $dbmfile = "/path/to/gdbm_test_file";
my %DBM;

eval {
    my $ok = tie(%DBM, 'GDBM_File', $dbmfile, &GDBM_WRCREAT, 0664);
    die "Error: Bad status!\n" unless $ok;
};
die "Error: Could not open $dbmfile.\n" if $@;

foreach my $key (sort(keys(%DBM))) {
    print "$key :: $DBM{$key}\n";
}
untie %DBM;

如果我 运行 此代码使用较旧的 i686 Perl 并且 $dbmfile 指向最近由同一 i686 Perl 创建的 GDBM 文件,它会正确读取 GDBM 文件并打印出其内容。

如果我 运行 此代码使用 x86_64 Perl 5.28.0,但是,它只是 无声地失败 。没有错误。完全没有输出。

如果我 运行 此代码使用 x86_64 Perl 5.10.1,eval 捕获“错误状态”错误,我得到 Error: Could not open /path/to/gdbm_test_file.

如果我使用 x86_64 Perl 5.28.0 创建一个 new GDBM 文件并尝试使用旧的 i686 Perl 读取它,i686 Perl 会死于 read errorforeach 行。

平台:CentOS 6.8

gdbm.i686 和 gdbm.x86_64 软件包都已安装并且版本相同:1.8.0-39

有什么建议吗?这不可能吗?

鉴于您对 32 位 gdbm 数据库和 64 位 gdbm 数据库不兼容的评论,我会使用 32 位版本的 gdbm_dump 实用程序将数据库转储到平面文件,然后将其提供给 gdbm_load 的 64 位版本到 re-create 数据库,以便 64 位 perl gdbm 库可以读取它。

根据 CentOS 提供的软件包,您可能必须从源代码构建这些以获得适当的版本——我不熟悉它。


或者,使用 32 位版本的 perl 编写一个快速工具来读取 32 位 gdbm 数据库并将其转换为不会遇到相同问题的不同 dbm,因此 32 位和 64 位-位程序可以使用相同的文件。

伪代码:

tie my %gdbm, 'GDBM_File', 'olddb.gdbm', read-only options;
tie my %other, 'Other_DBM', 'newdb.whatever', write/create options;
while (my ($key, $value) = each %gdbm) {
    $other{$key} = $value;
}
untie %gdbm;
untie %other;