2

我已经使用将哈希结构写入文件

print FILE Data::Dumper->Dump([$x], [ qw(*x) ]);

我如何从文件中读回这个?如果我使用 eval 如下代码片段所示,我得到的只是 $VAR1 = undef;

local $/; $hash_ref = eval <FILE>;
4

3 回答 3

4

如果这两个语句在同一个文件中,那么除非您关闭文件句柄并重新打开同一个文件进行读取,否则您不能这样做。你可以做一些花哨的事情,比如用模式打开它,+>然后seek在你再次阅读之前使用它回到开头,但是为什么要麻烦,特别是因为你已经在同一个程序中有一个包含相同数据的变量。

所以我假设你正在从一个程序中转储数据并在另一个程序中再次读取它。使用的问题Data::Dumper->Dump([$x], ['*x'])是它会取消引用$x并使用给定名称创建一个适当类型的变量。因此,如果$x是哈希引用,它将命名变量%x,如果它是数组引用,那么它将是@x等等。

最好去掉星号,直接写Data::Dumper->Dump([$x], ['x']),这样可以避免取消引用并命名变量$x

要读回文件,您应该只使用do. 像这样

use strict;
use warnings;

use Data::Dumper;

my $x = {
  a => 1,
  b => 2,
};

open my $fh, '>', 'dumper.txt' or die $!;
print $fh Data::Dumper->Dump([$x], ['x']);
close $fh;

my $data = do 'dumper.txt';

如果您受限于使用Data::Dumper显示的调用形式,则必须提供适当类型的变量,如下所示

use strict;
use warnings;

use Data::Dumper;

my $x = {
  a => 1,
  b => 2,
};

open my $fh, '>', 'dumper.txt' or die $!;
print $fh Data::Dumper->Dump([$x], ['*x']);
close $fh;

my %data = do 'dumper.txt';

请注意,虽然Data::Dumper输出文件引用了一个变量%x,但该文件作为单独的 Perl 程序运行,并且%x在执行do.

于 2013-11-11T12:41:57.350 回答
4

您可以使用核心模块Storable来完成此类任务。

use Storable;
store \%table, 'file';
$hashref = retrieve('file');
于 2013-11-11T12:05:19.740 回答
1

我尝试了几种方法来导出现有哈希。我发现可行的唯一方法是创建一个新的 var,它是指向现有哈希的指针。然后鲍罗丁的回答效果很好。

use strict;
use warnings;

use Data::Dumper;

my %x = (
  a => 1,
  b => 2,
);

my $x = \%x;  # <<< Added so $x is a reference to %x.
open my $fh, '>', 'dumper.txt' or die $!;
print $fh Data::Dumper->Dump([$x], ['*x']);
close $fh;

my %data = do 'dumper.txt';
于 2018-10-03T23:23:25.497 回答