我想知道你是否可以对我已经做了几天的代码有所了解。
我一直在尝试使用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 :(得分: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