Ошибка восстановления из 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