【问题标题】:Why are some hashes initialized using curly braces, and some with parentheses?为什么有些哈希使用花括号初始化,有些使用括号初始化?
【发布时间】:2012-08-04 02:11:36
【问题描述】:

我正在查看以下演示嵌套哈希的代码:

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 很奇怪:)。

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    来自 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" } );
    

    这就是为什么您会看到括号围绕着带有大括号的列表列表。

    【讨论】:

    • 只是为了完整性......虽然key3 => %foo 确实没有做它看起来的那样,但key3 => \%foo 添加了一个参考,并且是一种非常简单的方法来让它按照人们的意图去做那种情况。
    【解决方案2】:

    本质区别 (....) 用于创建哈希。 {....} 用于创建哈希 reference

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

    更详细一点 - {....} 创建一个匿名散列并返回对它的引用,该引用被分配给标量 $hash_ref

    已编辑以提供更多细节

    【讨论】:

      【解决方案3】:

      首先,括号在这里只改变优先级。它们与列表创建、哈希创建或哈希初始化无关。

      例如,以下两行是 100% 等效的:

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

      例如,以下两行是 100% 等效的:

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

      第二,不使用{ }初始化哈希;使用它创建一个哈希。 { } 等价于 my %hash;,只是哈希是匿名的。换句话说,

      { LIST }
      

      基本一样

      do { my %anon = LIST; \%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,
      );
      

      【讨论】:

      • “首先,括号在这里只改变优先级。它们与列表创建、哈希创建或哈希初始化无关”这就是我想要的。谢谢你,先生。 +1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 2013-06-26
      • 2018-03-06
      • 2018-05-14
      • 2021-07-29
      • 2017-07-24
      相关资源
      最近更新 更多