在Perl中获取HASH引用错误

时间:2014-07-27 03:51:30

标签: perl

我试图理解为什么我在一种情况下得到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){
  [...]
}

任何人都可以帮助我理解为什么会这样吗?我曾经多次碰到它,我真的很想绕过它。

1 个答案:

答案 0 :(得分:7)

您收到此错误的原因是因为此表达式:

$ips_per_host{$host}{$ip}

返回数字1。这是你在$sort_total{$count}存储的完美的好东西。

问题是你然后尝试将内容放入$sort_total{$count}{'host'}

当您使用嵌套数据结构时,Perl将尝试“自动生存”(生成)嵌套事物所需的结构层。因此Perl会检查$sort_total{$count}是否存在,确实存在。然后它检查该值是否是对另一个哈希的引用,因为您的表达式具有两级哈希。但事实并非如此;它已设置为值1。如果Perl要在那里自动生成哈希引用,它将删除你已经存储的内容,这可能不是你想要的。所以Perl退出并出现错误,假设你宁愿纠正这个而不是覆盖你的数据。

所以有一些选择。

  1. 如果$ips_per_host{$host}{$ip}实际上应该返回一个hashref而不是一个数字,那么这就是一个错误,所以要修复它。

  2. 如果$ips_per_host{$host}{$ip}确实应该是一个数字,那么将其分配给您要使用的哈希中的密钥,例如$sort_total{$count}{per_host} = $ips_per_host{$host}{$ip};

  3. 现在就使用两个单独的哈希值。