Perl搜索哈希哈希值并重新分配给另一个哈希值

时间:2014-06-06 13:09:05

标签: perl loops hash

我有一个示例哈希数据%dsr_config,转储为

$VAR1 = 'dc';
$VAR2 = {
          'Alias' => 'DC',
          'Address' => 'street1, street2, '
        };
$VAR3 = 'dsr';
$VAR4 = {
          'daddr' => '192.168.1.1',
          'dscp' => '2',
          'Vip_enabled' => 'True',
          'BL' => '4,8',
          'subnet' => '255.255.255.255'
        };
$VAR7 = 'backup';
$VAR8 = {
          'backup' => 'enabled'
        };    

现在,我正在尝试找到哈希

$VAR3 = 'dsr';
$VAR4 = {
          'daddr' => '192.168.1.1',
          'dscp' => '2',
          'Vip_enabled' => 'True',
          'BL' => '4,8',
          'subnet' => '255.255.255.255'
        };

因为它的值为'Vip_enabled'=> '真',

我写的是

    foreach my $key1 (keys %dsr_config) {
            foreach my $key2 (keys $dsr_config{$key1}){
                    if ($key2 =~ /Vip_enabled/){
                            %dsr_config = $dsr_config{$key1};
                            }
                    }
            }

print Dumper %dsr_config;

我正在尝试仅使用所需数据覆盖现有的%dsr_config。但我得到了

Reference found where even-sized list expected at ./test.pl line 43.
Type of argument to keys on reference must be unblessed hashref or arrayref at ./test.pl line 41.
Line 43 is   %dsr_config = $dsr_config{$key1};
Line 41 is   foreach my $key2 (keys $dsr_config{$key1}){

我在这里做错了什么?这个错误意味着什么?

2 个答案:

答案 0 :(得分:2)

内循环应该是:

foreach my $key2 (keys %{$dsr_config{$key1}}){
    if ($key2 =~ /Vip_enabled/){
        %dsr_config = ($key1 => $dsr_config{$key1});
    }
}

$dsr_config{$key1}是对散列的引用,如果要循环键,则必须取消引用它。

另外,我猜你想在找到Vip_enabled时退出外循环,因为下一次迭代会产生一个未定义的结果。

OUTERLOOP:
foreach my $key1 (keys %dsr_config) {
    foreach my $key2 (keys %{$dsr_config{$key1}}) {
        if ($key2 =~ /Vip_enabled/){
            %dsr_config = ($key1 => $dsr_config{$key1});
            last OUTERLOOP;
        }
    }
}

答案 1 :(得分:1)

可能这个:

foreach my $key2 (keys $dsr_config{$key1}){

应该是:

foreach my $key2 (keys %{$dsr_config{$key1}}){

键需要哈希。

...类似地

%dsr_config = %{$dsr_config{$key1}};

但很难说只是一个片段。