簡體   English   中英

在Perl中獲取HASH ref錯誤

[英]Getting HASH ref error in Perl

我試圖了解為什么在一種情況下而不是另一種情況下會出現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){
  [...]
}

誰能幫助我了解為什么會這樣? 我有幾次遇到它,我真的很想把它纏住。

您收到此錯誤的原因是因為以下表達式:

$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. 現在,請使用兩個單獨的哈希。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM