使用Storable存储哈希并在另一个脚本中使用它

时间:2016-12-16 12:02:39

标签: perl hash reference

我将脚本存储在脚本中(部分代码遗漏):

use strict;
use warnings;

use utf8;

use Storable qw(nstore_fd);

open( my $fh, ">",  'hash.hash');
my $hash_ref = \%hash;
nstore_fd($hash_ref, $fh);
close $fh;

创建文件hash.hash。然后,在另一个文件中,我尝试“导入”哈希并读取其要使用的值(例如,循环哈希,读取值,检查存在...)。

我尝试了一些简单的方法,即读取哈希,取消引用并读取其键,并打印出来。但是我得到了错误Not a HASH reference at CreateSql.pl line 12.这是一个标量。但我不明白为什么。模块的The documentation表示返回引用。

  

要检索存储到磁盘的数据,请使用带有文件名的检索。该   存储在该文件中的对象将重新创建到内存中,并且a   返回对根对象的引用。

那么我做错了什么,以及如何访问存储的哈希?

use strict;
use warnings;

use utf8;

use Data::Dumper;
use Storable qw(retrieve);

my ($hash_path) = @ARGV;

my $hash_ref = retrieve($hash_path);

my @keys = keys % { $hash_ref }; # throws error
print Dumper(\@keys);

1 个答案:

答案 0 :(得分:2)

你真的必须展示给你描述的问题的代码,否则你很难帮助你。您的问题中的代码无法编译。如果您想在发布之前对程序进行更改,再次测试以确保它至少编译,并显示您报告的问题

主要问题是您正在将二进制数据写入以文本形式打开的文件。如果您将open( my $fh, ">", 'hash.hash')更改为open( my $fh, ">:raw", 'hash.hash'),那么一切都应该正常工作

您自己的代码的这种变体可以正确地存储和检索一些示例数据

use strict;
use warnings 'all';

use Storable qw/ nstore_fd retrieve /;

use constant STORAGE => 'hash.hash';

my %hash = ( a => 'b', c => 'd' );

{
    open my $fh, '>:raw',  STORAGE or die $!;
    nstore_fd \%hash, $fh;
}

my $hash_ref = retrieve STORAGE;

use Data::Dump;

dd $hash_ref;

my @keys = keys % { $hash_ref }; # throws error
dd \@keys;

输出

{ a => "b", c => "d" }
["a", "c"]

但是,你做了一些奇怪的选择。没有必要使用nstore函数将数据存储在&#34;网络顺序&#34;中,如果您让模块打开文件本身,您可以完全避免这个问题< / p>

这是一个仅使用storeretrieve的变体。输出与上面代码的输出相同

use strict;
use warnings 'all';

use Storable qw/ store retrieve /;

use constant STORAGE => 'hash.hash';

my %hash = ( a => 'b', c => 'd' );

store \%hash, STORAGE;

my $hash_ref = retrieve STORAGE;

use Data::Dump;

dd $hash_ref;

my @keys = keys % { $hash_ref }; # throws error
dd \@keys;