假设我使用Data::Dumper
以下行创建了一个文本文件:
my $x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];
我想把这个文件读回来然后$x
回来.我试过这个:
my $vars; { undef $/; $vars =; } eval $vars;
但它似乎没有用 - $x
不仅没有定义,当我尝试使用它时,我得到一个警告
全局符号$ x需要显式包名称.
这样做的正确方法是什么?(是的,我知道它很难看.它是一个快速的实用程序脚本,而不是一个生命支持系统.)
这是一个提供几个不同选项的线程:Undumper
如果你只是在寻找数据持久性,那么Storable模块可能是你最好的选择.
正如其他人已经说过的那样,您可能最好以更好的序列化格式存储数据:
可存储 - 这是快速而简单的,但相当Perl特定(但将满足您对相对不重要的脚本中的快速解决方案的需求)
YAML,使用YAML模块,或YAML :: Tiny,或YAML :: Any作为包装器,以利用系统上可用的任何JSON模块
JSON,使用JSON模块或JSON :: XS以获得更高的速度(或JSON :: Any作为包装器,以利用系统上可用的任何JSON模块)
XML,使用XML-Simple模块或其他XML模块之一.
就个人而言,我认为我的目标是YAML或JSON ...你不能比以下更容易:
my $data = YAML::Any::LoadFile($filename);
默认情况下,eval不能解析Data :: Dumper输出,特别是如果被转储的数据结构在某种程度上是循环的.但是,你可以设置
$Data::Dumper::Purity = 1;
要么
$obj->Purity(1);
其中obj
是Data :: Dumper对象.这些中的任何一个都会导致Data :: Dumper生成可以由eval解析的输出.
有关所有详细信息,请参阅CPAN上的Data :: Dumper文档.
正如Rich所说,你可能不想使用Data :: Dumper来实现持久性,而是像Storable那样.
但是,为了回答问题... IIRC,Data :: Dumper没有声明你的变量my
,所以你自己也是这样做的吗?
为了能够重新eval
输入数据,变量不需要my
在eval中.如果您的文本文件包含:
$x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];
然后这将工作:
my $vars; { undef $/; $vars =; } my $x; eval $vars; print $x;