【问题标题】:Trouble thawing data structures stored with Storable::nfreeze?无法解冻使用 Storable::nfreeze 存储的数据结构?
【发布时间】:2012-12-11 12:14:37
【问题描述】:

我有一堆数据存储在 MySQL 表的单个列中。我可以访问将它存储在那里的约 5 年历史的 perl 代码,并且可以看到它是在存储之前用Storable::nfreeze 冻结的所有哈希值。 MySQL 列是TEXT,表设置为latin1 编码。我现在正在尝试检索这些数据以进行一次性导出。我知道该应用程序最初是在 perl 5.8.x 上运行的,所以我正在尝试使用 perl-5.8.8。不幸的是,我不知道使用的是什么版本的 Storable。

我第一次尝试使用最新的 Storable,2.39。这给了我:

Storable binary image v32.32 more recent than I am (v2.9) at
perlbrew/perls/perl-5.8.8/lib/5.8.8/darwin-2level/Storable.pm line 417`

使用 Storable-2.14 我得到了

Storable binary image v32.32 more recent than I am (v2.7) at blib/lib/Storable.pm
(autosplit into blib/lib/auto/Storable/thaw.al) line 363

使用 Storable-2.13 我得到了

Storable binary image v2.7 more recent than I am (v2.6) at blib/lib/Storable.pm  
(autosplit into blib/lib/auto/Storable/thaw.al) line 363

>= 2.14 中不合理的高二进制图像数字让我认为解析数字的方式发生了一些变化。我相信这段代码可能在 32 位操作系统上运行,现在我正在 64 位机器上尝试这个,这可能是相关的吗?接下来是我将尝试运行 2.13 和 2.14 之间的差异,看看我是否能找出导致变化的原因。

任何人都可以提供指导吗?

谢谢!

【问题讨论】:

  • 我怀疑 32 位 / 64 位问题可能确实相关。尝试在 32 位版本的 perl 上运行它,看看是否有帮助。

标签: perl storable


【解决方案1】:

格式 2.7 最初与 Storable 2.14 一起使用。

Perl 整数的大小(不是机器整数的大小)确实会导致无法解析数据。

【讨论】:

  • 谢谢!编译时如何配置perl的整数大小?
  • -Duse64bitint 为 64,但不能强制为 32。可能还有其他重要的差异。存储的数据并不是真正要在 Perl 构建之间共享。
  • 有没有办法从存储的数据中找出需要读取哪些 perl 配置?
【解决方案2】:

我遇到了类似的问题,但事实证明我需要先解码该值,然后才能解冻它。所以,

use Storable qw( thaw );
use MIME::Base64 qw( decode_base64 );
my $data = thaw( decode_base64( $frozen_thing ) );

在我的例子中,数据是使用 Apache::Session::Serialize::Base64 存储的。我曾假设它是使用 Apache::Session::Serialize::Storable 存储的,因此出现了问题。在这种情况下,错误消息是一条红鲱鱼,但至少你知道 something 是错误的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多