2009-06-17 89 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模塊作爲數據::自卸車更換