2013-11-25 48 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