当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我如何回读Data::Dumper的输出?》经验,为你挑选了4个好方法。

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

my $x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];

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

my $vars;
{
  undef $/;
  $vars = ;
}

eval $vars;

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

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

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



1> 小智..:

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

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



2> David Precio..:

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

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



3> Dale Hagglun..:

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

$Data::Dumper::Purity = 1;

要么

$obj->Purity(1);

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

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



4> Adam Bellair..:

正如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;

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有