【问题标题】:How do I convert Data::Dumper output back into a Perl data structure?如何将 Data::Dumper 输出转换回 Perl 数据结构?
【发布时间】:2009-06-17 07:06:38
【问题描述】:

我想知道您是否可以对我这几天一直在做的代码有所了解。

我一直在尝试使用 XMLout() 和 XMLin() 方法将 Perl 解析的哈希转换回 XML,并且这种格式非常成功。

#!/usr/bin/perl -w
use strict;

# use module
use IO::File;
use XML::Simple;
use XML::Dumper;
use Data::Dumper;
my $dump = new XML::Dumper;

my ( $data, $VAR1 );

Topology:$VAR1 = {  
   'device' => {  
    'FOC1047Z2SZ' => {  
      'ChassisID' => '2009-09',  
      'Error' => undef,  
      'Group' => {  
        'ID' => 'A1',  
        'Type' => 'Base'  
      },  
      'Model' => 'CATALYST',  
      'Name' => 'CISCO-SW1',  
      'Neighbor' => {},  
      'ProbedIP' => 'TEST',  
      'isDerived' => 0  
    }  
  },  
  'issues' => [  
    'TEST'  
  ]  
};  

# create object  
my $xml = new XML::Simple (NoAttr=>1,  
                           RootName=>'data',     
                           SuppressEmpty => 'true');  

# convert Perl array ref into XML document  
$data = $xml->XMLout($VAR1);  

#reads an XML file  
my $X_out = $xml->XMLin($data);  

# access XML data  
print Dumper($data);  
print "STATUS: $X_out->{issues}\n";  
print "CHASSIS ID: $X_out->{device}{ChassisID}\n";  
print "GROUP ID: $X_out->{device}{Group}{ID}\n";  
print "DEVICE NAME: $X_out->{device}{Name}\n";  
print "DEVICE NAME: $X_out->{device}{name}\n";  
print "ERROR: $X_out->{device}{error}\n";  

我可以毫无问题地访问 XML 中的所有元素。

但是当我尝试创建一个包含已解析哈希的文件时,出现了问题,因为我似乎无法访问所有 XML 元素。我想,我无法使用以下代码解析文件。

#!/usr/bin/perl -w
use strict;
#!/usr/bin/perl

# use module
use IO::File;  
use XML::Simple;  
use XML::Dumper;  
use Data::Dumper;  
my $dump = new XML::Dumper;  

my ( $data, $VAR1, $line_Holder );

#this is the file that contains the parsed hash  
my $saveOut = "C:/parsed_hash.txt";  
my $result_Holder = IO::File->new($saveOut, 'r');  
while ($line_Holder = $result_Holder->getline){  
    print $line_Holder;  
}  

# create object  
my $xml = new XML::Simple (NoAttr=>1, RootName=>'data', SuppressEmpty => 'true');  
# convert Perl array ref into XML document  
$data = $xml->XMLout($line_Holder);  
#reads an XML file  
my $X_out = $xml->XMLin($data);  

# access XML data  
print Dumper($data);  
print "STATUS: $X_out->{issues}\n";  
print "CHASSIS ID: $X_out->{device}{ChassisID}\n";  
print "GROUP ID: $X_out->{device}{Group}{ID}\n";  
print "DEVICE NAME: $X_out->{device}{Name}\n";  
print "DEVICE NAME: $X_out->{device}{name}\n";  
print "ERROR: $X_out->{device}{error}\n";  

您知道如何访问文本文件中的 $VAR1 吗?

问候,
newbee_me

【问题讨论】:

  • 请编辑您的帖子并放置所有代码部分以提高可读性
  • 你的初始代码(应该可以工作的那个)至少有几个错别字: $X_out->{device}{name} 应该是 $X_out->{device}{Name }(大写N,实际上上面的行有正确的字段名称),与下面的行相同,其中'error'应该是'Error'
  • 嗨 Manni,是的,你是对的,但是当我尝试在 XMLout() 上传递 $VARS1 时,它给了我元素 ... 和 虽然基于已解析的 perl 等效项,但它并不相同。感谢您的帮助!

标签: perl xml-simple


【解决方案1】:
$data = $xml->XMLout($line_Holder); 

$line_Holder 只有文件的最后一行,而不是整个文件,也没有评估文件产生的 perl hashref。试试这样的:

my $ref = do $saveOut;

do 函数为您加载和评估文件。您可能希望分步执行,例如:

use File::Slurp "read_file";
my $fileContents = read_file( $saveOut );
my $ref = eval( $fileContents );

【讨论】:

  • 感谢您的帮助,我知道 $line_Holder 仅保存文件的最后一行,我正在执行一些脚本来保存文本文件中的所有数据,但我不能找到一个有其目标的合适代码。很高兴你在这个 Slurp 上给了我这个想法。它现在可以看到解析后的 perl 等价物,我可以使用该代码访问它的所有数据。非常感谢!
【解决方案2】:

基本上是加载 Dumper 数据你 eval() 它:

use strict;
use Data::Dumper;
my $x = {"a" => "b", "c"=>[1,2,3],};
my $q = Dumper($x);
$q =~ s{\A\$VAR\d+\s*=\s*}{};
my $w = eval $q;
print $w->{"a"}, "\n";

正则表达式 (s{\A\$VAR\d+\s*=\s*}{}) 用于从字符串的开头删除 $VAR1=。

另一方面 - 如果您需要一种方法来存储复杂的数据结构并再次加载它,最好使用 Storable 模块,它是 store() 和 retrieve() 函数。

【讨论】:

  • 不需要正则表达式——赋值语句的值与赋值的右侧相同。
【解决方案3】:

您可能希望将 Data::Dump 模块视为 Data::Dumper 的替代品;它的输出已经准备好重新评估。

【讨论】:

  • +1。 Data::Dump 基本上是 Data::Dumper 做得对。它避免了对 $VAR1 等的赋值,并同时修复了几个棘手的边缘情况。
【解决方案4】:

这对我有用,适用于散列的散列。可能不适用于包含引用其他结构的结构。但对于简单的结构(如数组、散列或散列的散列)来说效果很好。

打开(数据,>“,$文件); 打印数据转储器(\%g_write_hash); 关闭(数据); 我的 %g_read_hash = %{ 做 $file };

【讨论】:

    【解决方案5】:

    请使用转储模块代替 Data::Dumper

    【讨论】:

      【解决方案6】:

      您可以使用$Data::Dumper::Varname 配置Data::Dumper 输出中使用的变量名称。

      例子

      使用 Data::Dumper $Data::Dumper::Varname = "foo"; 我的 $string = Dumper($object); 评估($字符串);

      ...将创建变量$foo,并应包含与$object 相同的数据。 如果你的数据结构比较复杂,结果很奇怪,不妨考虑 Storable 的freeze()thaw() 方法。

      【讨论】:

      • ...将创建$foo1 变量
      猜你喜欢
      • 2011-06-26
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多