2011-04-12 66 views
8

標準的googleable答案:「如何在Perl中找出散列的大小?」是「採取大小keys(%hash)」:爲什麼一個空的Perl哈希有一個關鍵?

my %h = {}; 
print scalar (keys (%h)); 

打印'1'。我期待着零。另一方面。類似地,

my %h = {}; 
$h{"a"} = "b"; 
$h{"x"} = "y"; 
print scalar keys (%h); 
print "\nKey: $_" for (keys %h); 

打印:

密鑰:一個

關鍵:X

鍵:HASH(0x229e8)

Wher有這額外的價值來自?

+10

你應該認真考慮啓用'warnings'編譯。它會抓住這個錯誤。 – rafl 2011-04-12 10:02:22

+1

將這些行放在** ALL **腳本的頂部: use strict; 使用警告; – shawnhcorey 2011-04-12 12:33:48

回答

20

這也有點讓我失望。

my %h =(); 

注意使用()代替{}

說明:值{}參考到散列,而不是散列本身。在Perl中,引用是一種標量值,並且對%h的賦值具有用於分配單個標量值的特殊處理。它將標量串聯起來(在您的情況下爲您提供字符串HASH(0x229e8)),並將該關鍵字與值undef關聯。

當使用()時,從列表到哈希的分配會創建列表中的鍵對/值對,並且由於()爲空,所以哈希%h變爲空。

+0

準確。在第二個示例中,%h = {}將創建映射「{} => UNDEF」的條目。 – 2011-04-12 09:54:09

+1

雖然這並不能解釋這種情況。 – 2011-04-12 10:00:14

+1

@Tomalak - 當然可以。閱讀你上面的評論。 – Ingo 2011-04-12 10:08:47

6
use Data::Dumper; 

my %h = {}; 
warn Dumper \%h; 

%h被分配與散列引用作爲鍵和undef作爲值。

輸出:

$VAR1 = { 
      'HASH(0x8683830)' => undef 
     }; 

由於rafl建議的,warnings編譯本來是可以趕上這一點。 查看Greg Hewgillanswer更正的代碼。

7

{}是對匿名散列的引用。所以my %h = {}相當於我的%h = ({} => undef)

Perl要求散列鍵是字符串,所以當您使用引用作爲鍵時,Perl會使用引用的字符串表示形式(HASH(0x229e8))。

24
$ perl -Mwarnings -e'my %h = {}' 
Reference found where even-sized list expected at -e line 1. 

strictwarnings包括用Perl有很好的理由。沒有理由不使用它們。

更妙的是,添加diagnostics混進去過:

$ perl -Mwarnings -Mdiagnostics -e'my %h = {}' 
Reference found where even-sized list expected at -e line 1 (#1) 
    (W misc) You gave a single reference where Perl was expecting a list 
    with an even number of elements (for assignment to a hash). This usually 
    means that you used the anon hash constructor when you meant to use 
    parens. In any case, a hash requires key/value pairs. 

     %hash = { one => 1, two => 2, }; # WRONG 
     %hash = [ qw/ an anon array/]; # WRONG 
     %hash = (one => 1, two => 2,); # right 
     %hash = qw(one 1 two 2);  # also fine 
+0

我總是使用嚴格的,雖然我不知道'警告'和'診斷'是額外的。謝謝! – spraff 2011-04-12 12:32:49

+7

「診斷」僅用於調試。當程序投入生產時將其刪除。 – 2011-04-12 13:12:14

+2

讓Perl回答問題的+1。 – darch 2011-04-12 16:02:46

相關問題