我有一个示例哈希数据%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}){
我在这里做错了什么?这个错误意味着什么?
答案 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}};
但很难说只是一个片段。