2012-08-07 35 views
15

我在看下面的代码演示嵌套的哈希值:为什么使用大括号初始化一些哈希值,还有一些使用括号?

my %HoH = (
    flintstones => { 
     husband => "fred", 
     pal  => "barney", 
    }, 
    jetsons => { 
     husband => "george", 
     wife  => "jane", 
     "his boy" => "elroy", # Key quotes needed. 
    }, 
    simpsons => { 
     husband => "homer", 
     wife  => "marge", 
     kid  => "bart", 
    }, 
); 

为什么是它最上面的散列(首发1)使用括号被初始化,而子哈希使用大括号初始化?

来自python背景我必须说Perl很奇怪:)。

回答

21

来自Perl背景我发现Perl也很奇怪。

使用圆括号初始化散列(或数组)。散列是一组字符串和一组标量值之间的映射。

%foo = ("key1", "value1", "key2", "value2", ...); # % means hash 
%foo = (key1 => "value1", key2 => "value2", ...); # same thing 

牙套被用来定义一个散列参考。所有引用都是标量值。

$foo = { key1 => "value1", key2 => "value2", ... }; # $ means scalar 

哈希是标量值。由于散列中的值必须是是标量,因此不可能将散列用作另一个散列的值。

%bar = (key3 => %foo);  # doesn't mean what you think it means 

但是我们可以使用散列引用作为另一个散列的值,因为散列引用是标量。

$foo = { key1 => "value1", key2 => "value2" }; 
%bar = (key3 => $foo); 
%baz = (key4 => { key5 => "value5", key6 => "value6" }); 

而这就是为什么你会看到带有花括号的列表的圆括号。

+4

只是为了完整性......而这是真的,'KEY3 =>%foo'没有做什么,似乎,'KEY3 => \%foo'增加了一个参考并且是一种非常简单的方式来使其按照人们的意愿去做在那种情况下。 – 2012-08-07 06:06:58

2

首先,parens什么都不做,只是在这里改变优先顺序。它们与列表创建,哈希创建或哈希初始化无关。您可以使用括号周围散创作的运算数,

{ (a => 1, b => 2) } 

,你可以忽略周围的赋值运算符的操作数的括号时,优先允许。

sub f { return a => 1, b => 2 } 
my %hash = f(); 

其次,一个不使用初始化{ }散列;使用它创建一个散列。 { }相当于my %hash;,除了散列是匿名的。换句话说,

{ EXPR } 

是基本相同

do { my %anon = EXPR; \%anon } 

(但不创建一个词汇范围)。

匿名散列允许一个写的

my %HoH = (
    flintstones => { 
     husband => "fred", 
     pal  => "barney", 
    }, 
    jetsons => { 
     husband => "george", 
     wife  => "jane", 
     "his boy" => "elroy", 
    }, 
    simpsons => { 
     husband => "homer", 
     wife  => "marge", 
     kid  => "bart", 
    }, 
); 

代替

my %flintstones = (
    husband => "fred", 
    pal  => "barney", 
); 
my %jetsons = (
    husband => "george", 
    wife  => "jane", 
    "his boy" => "elroy", 
); 
my %simpsons = (
    husband => "homer", 
    wife  => "marge", 
    kid  => "bart", 
); 
my %HoH = (
    flintstones => \%flinstones, 
    jetsons  => \%jetsons, 
    simpsons => \%simpsons, 
); 
6

的本质区别(....)用于创建散列。 {....}被用于创建哈希参考

my %hash = (a => 1 , b => 2) ; 
my $hash_ref = { a => 1 , b => 2 } ; 

在稍微详细 - {....}使得一个匿名散列并返回与该至极被asigned为标量的参考$hash_ref

编辑给多一点细节