我如何回读Data :: Dumper的输出?

mik*_*ike 5 perl persistence data-dumper

假设我使用Data::Dumper以下行创建了一个文本文件:

my $x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];
Run Code Online (Sandbox Code Playgroud)

我想把这个文件读回来然后$x回来.我试过这个:

my $vars;
{
  undef $/;
  $vars = <FILE>;
}

eval $vars;
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用 - $x不仅没有定义,当我尝试使用它时,我得到一个警告

全局符号$ x需要显式包名称.

这样做的正确方法是什么?(是的,我知道它很难看.它是一个快速的实用程序脚本,而不是一个生命支持系统.)

小智 11

这是一个提供几个不同选项的线程:Undumper

如果你只是在寻找数据持久性,那么Storable模块可能是你最好的选择.


Dav*_*ous 10

正如其他人已经说过的那样,您可能最好以更好的序列化格式存储数据:

  • 可存储 - 这是快速而简单的,但相当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);


Dal*_*und 8

默认情况下,eval不能解析Data :: Dumper输出,特别是如果被转储的数据结构在某种程度上是循环的.但是,你可以设置

$Data::Dumper::Purity = 1;
Run Code Online (Sandbox Code Playgroud)

要么

$obj->Purity(1);
Run Code Online (Sandbox Code Playgroud)

其中obj是Data :: Dumper对象.这些中的任何一个都会导致Data :: Dumper生成可以由eval解析的输出.

有关所有详细信息,请参阅CPAN上的Data :: Dumper文档.


Ada*_*ire 6

正如Rich所说,你可能不想使用Data :: Dumper来实现持久性,而是像Storable那样.

但是,为了回答问题... IIRC,Data :: Dumper没有声明你的变量my,所以你自己也是这样做的吗?

为了能够重新eval输入数据,变量不需要my在eval中.如果您的文本文件包含:

$x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];
Run Code Online (Sandbox Code Playgroud)

然后这将工作:

my $vars;
{
  undef $/;
  $vars = <FILE>;
}

my $x;    
eval $vars;
print $x;
Run Code Online (Sandbox Code Playgroud)