perl:无法捕获eval返回值

时间:2016-12-12 18:50:13

标签: perl

我对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版本,它们是一样的。关于这个问题的任何线索?

2 个答案:

答案 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),错误消息将写入$@(这是一种不太深奥的知识,可以在evalperlvar文档中找到。因此,当您使用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.