【问题标题】:Getting HASH ref error in Perl在 Perl 中获取 HASH ref 错误
【发布时间】:2014-07-27 03:51:29
【问题描述】:

我试图了解为什么在一种情况下会出现 HASH ref 错误,而在另一种情况下却没有。错误:在 ./a.pl 第 351 行使用“strict refs”时,不能使用字符串 ("1") 作为 HASH ref。错误行由 指示

问题代码:

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){
  [...]
}

谁能帮我理解为什么会这样?我已经多次遇到它,我真的很想把头绕在它周围。

【问题讨论】:

    标签: perl


    【解决方案1】:

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

    $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. 像现在这样使用两个单独的哈希值。

    【讨论】:

      猜你喜欢
      • 2014-11-09
      • 2016-02-25
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      相关资源
      最近更新 更多