我对perl eval返回值有一个奇怪的问题。我想在txt文件中存储一些哈希数据结构,然后通过eval恢复它。 以下代码适用于我的test.pl
use Data::Dumper;
my $read_str = `cat sims/pgcache/.gsim/metadata.txt`;
my $metadata = eval($read_str);
print STDERR "read_str = $read_str\n";
print Dumper("metadata",$metadata);
print 'perl version = ',$^V,"\n";
但是当我将这段代码注入到我们现有的大型perl脚本时,$ metadata返回的内容与$ read_str完全相同,与我的test.pl完全相同。
我已经检查了perl版本,它们是一样的。关于这个问题的任何线索?
答案 0 :(得分:6)
不要这样做。 Data::Dumper
旨在作为调试工具
更好的方法是使用 Makamaka的 JSON
模块序列化您的数据结构,使用to_json
和{{ 1}}函数
您还应该避免启动一个全新的过程只是为了使用from_json
来读取文本文件。 Perl能够在没有任何帮助的情况下读取文件
这是一个例子。就像你自己的代码一样,它只显示解码过程,并且需要一个文件cat
,它包含一个JSON数据结构才能工作
sims/pgcache/.gsim/metadata.txt
答案 1 :(得分:3)
您使用的是strict
吗? Data::Dumper
输出以$VAR1 = ...
开头。如果您尚未声明名为$VAR1
的变量,则strict
会使您的程序失败。
my $read_str = `cat sims/pgcache/.gsim/metadata.txt`;
my $VAR1;
my $metadata = eval($read_str);
" Gosh",你说。 "多么深奥的知识。如何才能让我知道并解决这个问题?"
好吧,当eval
失败时(并且在某些情况下可能会导致失败的情况下,通常会使用eval
),错误消息将写入$@
(这是一种不太深奥的知识,可以在eval
或perlvar文档中找到。因此,当您使用eval
时,尤其是当eval
似乎没有返回任何内容时,您应该检查$@
。
use strict;
my $read_str = '$VAR1 = {}';
my $metadata = eval($read_str);
die $@ if $@;
生成:Global symbol "$VAR1" requires explicit package name at (eval 1) line 1.