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需要显式包名称.
这样做的正确方法是什么?(是的,我知道它很难看.它是一个快速的实用程序脚本,而不是一个生命支持系统.)
Dav*_*ous 10
正如其他人已经说过的那样,您可能最好以更好的序列化格式存储数据:
就个人而言,我认为我的目标是YAML或JSON ...你不能比以下更容易:
my $data = YAML::Any::LoadFile($filename);
默认情况下,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文档.
正如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)
| 归档时间: |
|
| 查看次数: |
11787 次 |
| 最近记录: |