Ошибка восстановления из nstore_fd: невозможно найти метод объекта "FIRSTKEY" через пакет "Hash::Case::Lower"

Я занимаюсь археологией программы с 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.

... но я в растерянности, что с этим делать!

1 ответ

Решение

Когда вы восстанавливаете объекты, которые tied в пакеты, сначала нужно загрузить их классы. Storable а также, например, Sereal не будет загружать их для вас. Он воссоздает объекты по мере их хранения, и Perl ожидает, что пакеты существуют.

Все, что вам нужно сделать, это загрузить модуль перед десериализацией вашей резервной копии.

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

my $data = fd_retrieve(*STDIN);  # the backup file 
Другие вопросы по тегам