我正在使用XMLin读取xml文件,它给了我这个......
'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'
},
]
}
我正在尝试搜索特定名称的{详细信息} [名称]值。所以我想搜索弗雷德来获取他的名字和IP地址。
foreach my $ruleline ($pricesettings->{Details}{Detail}['Name']){
if ($pricesettings->{Details}{Detail}["Name"] eq "Fred") {
print "Found you\n";
}
else {
print "Not found\n";
}
}
但即使我在for循环中打印Dumper($ pricesettings-> {Details} {Detail} ['Name']),它也会打印Bill的第一个记录条目。
理想情况下,我希望看到像
这样的输出Name => 'Bill'<br>
Name => 'Ted'<br>
Name => 'Fred'<br>
然后,如果发现Fred,我想得到Fred的IP地址或ID。例如,找到或比较值'Date'或'Total'没有问题,但是'Detail'下的每个分组都会导致我遇到问题。
答案 0 :(得分: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(虽然这可能有点过分)。