在perl哈希中搜索值

时间:2013-11-25 15:21:22

标签: arrays perl hash

我正在使用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'下的每个分组都会导致我遇到问题。

1 个答案:

答案 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(虽然这可能有点过分)。