我试图理解为什么我在一种情况下得到HASH引用错误而不是另一种情况。错误:不能使用字符串(" 1")作为HASH参考,而#34; strict refs"在./a.pl第351行使用。错误行由< -
表示问题代码:
my $count = 0;
my %sort_total;
foreach my $host (keys %ips_per_host) {
foreach my $ip (keys %{$ips_per_host{$host}}) {
$sort_total{$count} = $ips_per_host{$host}{$ip};
$sort_total{$count}{'host'} = $host; <--
$sort_total{$count}{'ip'} = $ip;
$count++;
}
}
foreach $count (sort {$sort_total{$a} cmp $sort_total{$b} }keys %sort_total){
[...]
}
但是,如果我创建另一个哈希并使用它,则没有错误。
my $count = 0;
my %sort_total;
my %sort_hosts;
foreach my $host (keys %ips_per_host) {
foreach my $ip (keys %{$ips_per_host{$host}}) {
$sort_total{$count} = $ips_per_host{$host}{$ip};
$sort_hosts{$count}{'host'} = $host;
$sort_hosts{$count}{'ip'} = $ip;
$count++;
}
}
foreach $count (sort {$sort_total{$a} cmp $sort_total{$b} }keys %sort_total){
[...]
}
任何人都可以帮助我理解为什么会这样吗?我曾经多次碰到它,我真的很想绕过它。
答案 0 :(得分:7)
您收到此错误的原因是因为此表达式:
$ips_per_host{$host}{$ip}
返回数字1
。这是你在$sort_total{$count}
存储的完美的好东西。
问题是你然后尝试将内容放入$sort_total{$count}{'host'}
。
当您使用嵌套数据结构时,Perl将尝试“自动生存”(生成)嵌套事物所需的结构层。因此Perl会检查$sort_total{$count}
是否存在,确实存在。然后它检查该值是否是对另一个哈希的引用,因为您的表达式具有两级哈希。但事实并非如此;它已设置为值1
。如果Perl要在那里自动生成哈希引用,它将删除你已经存储的内容,这可能不是你想要的。所以Perl退出并出现错误,假设你宁愿纠正这个而不是覆盖你的数据。
所以有一些选择。
如果$ips_per_host{$host}{$ip}
实际上应该返回一个hashref而不是一个数字,那么这就是一个错误,所以要修复它。
如果$ips_per_host{$host}{$ip}
确实应该是一个数字,那么将其分配给您要使用的哈希中的密钥,例如$sort_total{$count}{per_host} = $ips_per_host{$host}{$ip};
现在就使用两个单独的哈希值。