代码之家  ›  专栏  ›  技术社区  ›  GreenAsJade

从nstore_fd还原时出错:无法通过包“hash::case::lower”找到对象方法“firstkey”

  •  1
  • GreenAsJade  · 技术社区  · 7 年前

    我在做一个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 回复  |  直到 7 年前
        1
  •  4
  •   Borodin    7 年前

    当您还原 tied 对于包,首先需要加载它们的类。 Storable 例如, Sereal 不会给你装的。它在存储对象时重新创建对象,Perl期望包存在。

    您只需在反序列化备份之前加载模块。

    use Storable qw(fd_retrieve); 
    use Hash::Case::Lower;
    
    my $data = fd_retrieve(*STDIN);  # the backup file