1

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

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

4

6 回答 6

5
$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 );
于 2009-06-17T07:49:10.783 回答
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() 函数。

于 2009-06-17T16:56:48.970 回答
4

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

于 2009-06-17T20:13:47.063 回答
1

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

例子

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

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

于 2009-06-17T23:34:20.637 回答
1

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

打开(数据,>“,$文件);
 打印数据转储器(\%g_write_hash);
 关闭(数据);

 我的 %g_read_hash = %{ 做 $file };
于 2009-11-07T23:00:18.537 回答
1

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

于 2010-04-10T02:24:05.340 回答