如何将Data :: Dumper输出转换回Perl数据结构?

时间:2009-06-17 07:06:39

标签: perl xml-simple

我想知道你是否可以对我已经做了几天的代码有所了解。

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

6 个答案:

答案 0 :(得分: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 );

答案 1 :(得分:4)

基本上要加载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()函数。

答案 2 :(得分:4)

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

答案 3 :(得分:1)

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

实施例

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

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

答案 4 :(得分:1)

这对我来说很有用,因为哈希的哈希。对于包含引用其他结构的结构,可能不会很好地工作。但是对于简单的结构(如数组,哈希或散列哈希)来说效果很好。

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

 my %g_read_hash = %{ do $file };

答案 5 :(得分:1)

请使用dump模块替代Data :: Dumper