1

我正在对 2005 年的一个程序进行一些考古。它一直在愉快地编写这样的备份:

use Storable qw(nstore_fd);  
my %data = 
    (
     "Games" => \%Games,
     "Members" => \%Members,
     "Scenarios" => \%Scenarios,
     "Passwords" => \%Passwords,
     "TourneyNames" => \%TourneyNames
     );

    nstore_fd(\%data, *BACKUP) or die "Can't write backup: $!";

我需要恢复其中的一些数据。

我这样做了:

use Storable qw(fd_retrieve); 

$data = fd_retrieve(*STDIN);  # the backup file 

print keys %{$data}, "\n";

foreach $thing (keys(%{$data})) {
    print "$thing\n";
    print scalar keys %{$data->{$thing}}, "\n";
}

并得到:

$ perl ~/foo.pl < BobsterBackup2018-7-9-35131.bak
GamesMembersPasswordsScenariosTourneyNames
Games
15556
Members
Can't locate object method "FIRSTKEY" via package "Hash::Case::Lower" at /Users/mgregory/foo.pl line 9.
$ 

我看到原始来源有:

tie %Members, 'Hash::Case::Lower';    # index by non-case-sensitive member-name.

...但我不知道该怎么做!

4

1 回答 1

4

当您将对象恢复 tied 到包中时,您首先需要加载它们的类。 Storable 以及,例如, Sereal 不会为您加载它们。它在存储对象时重新创建对象,并且 Perl 期望包存在。

您需要做的就是在反序列化备份之前加载模块。

use Storable qw(fd_retrieve); 
use Hash::Case::Lower;

my $data = fd_retrieve(*STDIN);  # the backup file 
于 2018-07-18T11:42:58.273 回答