2009-06-17 38 views
1

我想知道你是否可以在我已经做了几天的代码中发现一些灯光。如何将Data :: Dumper输出转换回Perl数据结构?

我一直在尝试使用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

+0

请编辑您张贴,并把所有的代码段这样可读性更好 – Dror 2009-06-17 07:29:07

+0

您最初的代码(即应该工作的一个)在至少有几个错别字:$ X_out - > {device} {name}应该是$ X_out - > {device} {Name}(大写N,实际上面的行有正确的字段名),与行相同下面,'错误'应该是'错误' – mirod 2009-06-17 07:52:51

+0

嗨曼尼, 是的,你是对的,但当我尝试通过XMLout()$ VARS1,它给了我的元素 ...尽管基于解析的perl等价物,但它并不相同。 感谢您的帮助! – 2009-06-17 09:25:25

回答

5
$data = $xml->XMLout($line_Holder); 

$ line_Holder只有你的文件的最后一行,而不是整个文件,而不是将导致从evaling文件perl的hashref。尝试这样的:

my $ref = do $saveOut; 

do函数为您加载并为其提供一个文件。你可能想这样做在单独的步骤,如:

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

感谢您的帮助ysth,我明白,$ line_Holder只包含文件的最后一行,我正在做一些脚本,将保存文本文件中的所有数据,但我找不到合适的代码目的。很高兴你在这款Slurp上给了我这个想法。它现在可以看到解析后的perl等价物,我可以使用该代码访问其所有数据。 非常感谢您! – 2009-06-17 09:21:55

4

基本上装入翻斗车的数据,你的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()函数会更好。

+1

正则表达式不是必需的 - 赋值语句的值与赋值的右侧相同。 – nohat 2009-06-17 18:24:55

4

您可能希望查看Data :: Dump模块以取代Data :: Dumper;其产出已经准备好重新评估。

1

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

 
use Data::Dumper 
$Data::Dumper::Varname = "foo"; 
my $string = Dumper($object); 
eval($string); 

...将创建变量$foo,并应包含相同的数据作为$object。 如果您的数据结构比较复杂并且结果很奇怪,那么您可能需要考虑Storable的freeze()thaw()方法。

1

对于我来说,这适用于散列哈希值。对于包含引用其他结构的结构来说,可能效果不佳。但对于简单的结构,如数组,散列或散列哈希来说,它已经足够好用了。

 
open(DATA,">",$file); 
print DATA Dumper(\%g_write_hash); 
close(DATA); 

my %g_read_hash = %{ do $file }; 
1

请使用dump模块作为数据::自卸车更换