2013-11-25 57 views
0

我使用XMLin在一個XML文件中讀取,這讓我這個......尋找一個Perl哈希值

'Date' => '01Jan2013', 
'Total' => 3, 
'Details' => { 
    'Detail' => [ 
       { 
       'Name' => 'Bill', 
       'ID' => '123', 
       'IP' => '255.255.255.1' 
       }, 
       { 
       'Name' => 'Ted', 
       'ID' => '456', 
       'IP' => '255.255.255.2' 
       }, 
       { 
       'Name' => 'Fred', 
       'ID' => '789', 
       'IP' => '255.255.255.3' 
       }, 
      ] 
     } 

我試圖搜索{}詳細[名稱]值一個特定的名字。所以我想搜索Fred來獲取他的名字和IP地址。

foreach my $ruleline ($pricesettings->{Details}{Detail}['Name']){ 
    if ($pricesettings->{Details}{Detail}["Name"] eq "Fred") { 
     print "Found you\n"; 
    } 
    else { 
     print "Not found\n"; 
    } 
} 

但是即使我打印自卸車($ pricesettings - > {詳細} {}細節[ '名稱'])中的for循環只打印第一個記錄條目比爾。

理想我想看到像

Name => 'Bill'<br> 
Name => 'Ted'<br> 
Name => 'Fred'<br> 

然後輸出,如果弗雷德發現我希望得到弗雷德的IP地址或ID。例如,我沒有發現或比較'Date'或'Total'的值的問題,但是在'Detail'下的每個分組都會造成我的問題。

+0

這是因爲數組通過數字索引,「Name」被視爲零。 –

+0

看起來您正在使用'XML :: Simple-> XMLin()',在這種情況下,升級到更好的XML模塊可能是個好主意,例如['XML :: LibXML'] (http://search.cpan.org/perldoc?XML%3A%3ALibXML) – TLP

回答

2

你的代碼片段稍微偏離。相反,嘗試

foreach my $ruleline (@{$pricesettings->{Details}{Detail}}){ 
    if ($ruleline->{"Name"} eq "Fred") { 
     print "Found you\n"; 
    } 
    else { 
     print "Not found\n"; 
    } 
} 

爲了在你真正瞄準輸出到達,請嘗試以下操作:

foreach my $ruleline (@{$pricesettings->{Details}{Detail}}){ 
    print "Name -> '$$ruleline{Name}'" ; 
    if ($$ruleline{Name} eq "Fred") { 
     print "; ID -> '$$ruleline{ID}', IP -> '$$ruleline{IP}';" ; 
    } 
    print "\n"; 
} 

技術解釋: 在你混了數組和哈希原密碼。對於您所使用的複雜數據結構,您可能會考慮切換到oo編程風格,可能使用Moose(儘管這可能是矯枉過正)。

+0

完美。非常感謝。它的位置。 – John