Perl 如何读回Data::Dumper的输出?
假设我创建了一个文本文件,使用以下内容:Perl 如何读回Data::Dumper的输出?,perl,persistence,data-dumper,Perl,Persistence,Data Dumper,假设我创建了一个文本文件,使用以下内容: my $x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ]; 我想把那个文件读回,然后拿回$x。我试过这个: my $vars; { undef $/; $vars = <FILE>; } eval $vars; my$vars; { 未定义$/; $vars=; } eval$vars; 但它似乎不起作用--$x不仅没有定义,当我尝试使用它时,我得到一个警
my $x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];
我想把那个文件读回,然后拿回$x
。我试过这个:
my $vars;
{
undef $/;
$vars = <FILE>;
}
eval $vars;
my$vars;
{
未定义$/;
$vars=;
}
eval$vars;
但它似乎不起作用--$x不仅没有定义,当我尝试使用它时,我得到一个警告
全局符号$x需要显式的包名
正确的方法是什么?(是的,我知道它很难看。它是一个快速实用程序脚本,而不是生命支持系统。)这里有一个线程,它提供了两个不同的选项:
如果您只是在寻找数据持久性,那么可存储模块可能是您的最佳选择。正如Rich所说,您可能不想使用data::Dumper进行持久性,而是希望使用类似于可存储的功能 然而,要回答这个问题。。。IIRC,Data::Dumper不会将变量声明为
my
,所以你自己也会这么做吗
为了能够eval
返回数据,变量不需要在eval中my
。如果您的文本文件包含以下内容:
$x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];
那么这就行了:
my $vars;
{
undef $/;
$vars = <FILE>;
}
my $x;
eval $vars;
print $x;
my$vars;
{
未定义$/;
$vars=;
}
我的$x;
eval$vars;
打印$x;
您确定该文件是由Data::Dumper创建的吗?那里不应该有my
其他一些选项包括可存储、YAML或DBM::Deep。我在本书的“持久性”一章中介绍了一些例子
祝你好运,:)默认情况下,eval无法解析Data::Dumper输出,特别是在转储的数据结构以某种方式是循环的情况下。但是,您可以设置
$Data::Dumper::Purity = 1;
或
其中,obj
是一个Data::Dumper对象。这两种方法都会导致Data::Dumper生成可由eval解析的输出
有关所有详细信息,请参阅。我想您希望
our $x;
在访问x之前输入代码。这将满足严格的错误检查
话虽如此,我还是和其他人一样,建议使用Storable。这对我来说很好: 写出:
open(my $C, qw{>}, $userdatafile) or croak "$userdatafile: $!";
use Data::Dumper;
print $C Data::Dumper->Dump([\%document], [qw(*document)]);
close($C) || croak "$userdatafile: $!";
阅读:
open(my $C, qw{<}, $userdatafile) or croak "$userdatafile: $!";
local $/ = $/;
my $str = <$C>;
close($C) || croak "$userdatafile: $!";
eval { $str };
croak $@ if $@;
open(我的$C,qw{正如其他人所说,您可能最好以更好的序列化格式存储数据:
- -这很快也很容易,但相当特定于Perl(但可以很容易地满足您对相对不重要的脚本中的快速解决方案的需求)
- ,使用模块、或或作为包装器来利用系统上可用的JSON模块
- ,使用该模块,或为了提高速度(或作为包装器利用系统上可用的JSON模块)
- XML,使用模块或其他XML模块之一
就我个人而言,我认为我的目标是YAML或JSON……你不可能比:
my$data=YAML::Any::LoadFile($filename);
如果您想继续使用简单易懂的东西,只需使用模块而不是数据::转储程序
。基本上,它是数据::转储程序
做得很好--它生成有效的Perl表达式以备赋值,而不需要创建所有奇怪的$VAR1
、$VAR2
等变量
然后,如果您的代码如下所示:
my $x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];
使用以下命令保存它:
use Data::Dump "pp";
open F, ">dump.txt";
print F pp($x);
open F, "dump.txt";
my $vars;
{ local $/ = undef; $vars = <F>; }
my $x = eval $vars;
这将生成一个文件dump.txt
,看起来(至少在我的电脑上):
使用以下命令加载它:
use Data::Dump "pp";
open F, ">dump.txt";
print F pp($x);
open F, "dump.txt";
my $vars;
{ local $/ = undef; $vars = <F>; }
my $x = eval $vars;
打开F,“dump.txt”;
我的$vars;
{local$/=unde;$vars=;}
my$x=评估$vars;
注意
如果您费心将分配给$/
的任务放在它自己的块中,您应该使用local
,以确保它的值在块的末尾实际恢复;以及
eval()
的结果需要分配给$x
这段代码很短,对我有用(我在数组中读取)。它从第一个脚本参数获取文件名
# Load in the Dumper'ed library data structure and eval it
my $dsname = $ARGV[0];
my @lib = do "$dsname";
Data::Dumper并不是存储数据的好选择。它更像是一个调试工具。如果系统上安装了JSON::XS,JSON模块现在将默认使用JSON::XS