2011-04-12 34 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

相关问题