代码之家  ›  专栏  ›  技术社区  ›  porton

Perl哈希不能按预期工作

  •  2
  • porton  · 技术社区  · 7 年前
    #!/usr/bin/perl
    
    sub f { {
      a => 1,
      b => 2
    } }
    
    sub g { {
      %{f()},
      c => 3,
      d => 4,
    } }
    
    use Data::Dumper;
    print Dumper g();
    

    以上代码输出

    $VAR1 = 'a';
    $VAR2 = 1;
    $VAR3 = 'b';
    $VAR4 = 2;
    $VAR5 = 'c';
    $VAR6 = 3;
    $VAR7 = 'd';
    $VAR8 = 4;
    

    尽管在我看来,它应该输出

    $VAR1 = {
              'a' => 1,
              'c' => 3,
              'b' => 2,
              'd' => 4
            };
    

    我的误解是什么?

    2 回复  |  直到 7 年前
        1
  •  9
  •   Borodin    7 年前

    g

    use strict;
    use warnings 'all';
    
    sub foo {
        {
            a => 1,
            b => 2,
        }
    }
    
    sub bar {
        my $href = {
            %{ foo() },
            c => 3,
            d => 4,
        }
    }
    
    use Data::Dump;
    dd bar();
    

    { a => 1, b => 2, c => 3, d => 4 }
    
        2
  •  7
  •   ikegami Gilles Quénot    7 年前

    sub some_sub {
       {  }     # Is this a hash constructor or a block?
    }
    

    { }

    f() g()

    +

    +{ }   # Must be a hash constructor.
    

    {; }   # Perl looks ahead, and sees that this must be a block.
    

    sub g { +{
      %{f()},
      c => 3,
      d => 4,
    } }
    

    sub g { return {
      %{f()},
      c => 3,
      d => 4,
    } }
    

    return