1

我有一些使用旧的 32 位 (i686) 版本的 Perl (5.8.6) 创建的 GDBM 文件,我想与 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 创建一个的GDBM 文件并尝试使用旧的 i686 Perl 读取它,i686 Perl 就会死掉read errorforeach

平台:CentOS 6.8

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

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

4

1 回答 1

2

鉴于您对 32 位 gdbm 数据库和 64 位 gdbm 数据库不兼容的评论,我将使用该gdbm_dump实用程序的 32 位版本将数据库转储到平面文件,然后将其提供给 64-位版本的gdbm_load重新创建数据库,以便它可以被 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;
于 2020-10-15T03:12:27.267 回答