什么`sub bar {+ {$ _ [1] => $ _ [2]}}`究竟做什么?

now*_*wox 13 perl hash

我不明白+这个例子中的糖标志是在goggling的某处拍摄的:

sub bar { +{$_[1] => $_[2]} }
Run Code Online (Sandbox Code Playgroud)

我写了这个,我看不出有什么不同:

use Data::Dumper;

# Not any differences here
my $foo =  {value => 55};
my $bar = +{value => 55};

print Dumper $foo;
print Dumper $bar;

# Oh ! Here there is something...
sub foo {  {$_[1] => $_[2]} };
sub bar { +{$_[1] => $_[2]} };

print Dumper foo('value', 55);    
print Dumper bar('value', 55);    
Run Code Online (Sandbox Code Playgroud)

foo 回报

$VAR1 = 55;
$VAR2 = undef;
Run Code Online (Sandbox Code Playgroud)

bar 回报

$VAR1 = {
          '55' => undef
        };
Run Code Online (Sandbox Code Playgroud)

Mat*_*teo 16

它有助于解析器区分匿名散列和代码块.

引用学习Perl对象,参考和模块

因为块和匿名哈希构造函数都在语法树中大致相同的位置使用花括号,所以编译器必须对您所指的两个中的哪一个进行临时确定.如果编译器决定不正确,您可能需要提供提示以获得所需内容.要向编译器显示您想要匿名哈希构造函数,请在左大括号前加上一个加号:+ {...}.为了确保得到一个代码块,只需在块的开头放一个分号(表示一个空语句):{; ......}.

或者从map功能文档:

"{" starts both hash references and blocks, so "map { ..." could
be either the start of map BLOCK LIST or map EXPR, LIST. Because
Perl doesn't look ahead for the closing "}" it has to take a guess
at which it's dealing with based on what it finds just after the
"{". Usually it gets it right, but if it doesn't it won't realize
something is wrong until it gets to the "}" and encounters the
missing (or unexpected) comma. The syntax error will be reported
close to the "}", but you'll need to change something near the "{"
such as using a unary "+" or semicolon to give Perl some help:

    %hash = map {  "\L$_" => 1  } @array # perl guesses EXPR. wrong
    %hash = map { +"\L$_" => 1  } @array # perl guesses BLOCK. right
    %hash = map {; "\L$_" => 1  } @array # this also works
    %hash = map { ("\L$_" => 1) } @array # as does this
    %hash = map {  lc($_) => 1  } @array # and this.
    %hash = map +( lc($_) => 1 ), @array # this is EXPR and works!

    %hash = map  ( lc($_), 1 ),   @array # evaluates to (1, @array)

or to force an anon hash constructor use "+{":

    @hashes = map +{ lc($_) => 1 }, @array # EXPR, so needs
                                           # comma at end

to get a list of anonymous hashes each with only one entry apiece.
Run Code Online (Sandbox Code Playgroud)

  • @nowox你也可以尝试使用http://symbolhound.com/这对于搜索谷歌剥离的东西很有用 (3认同)
  • 我通过阅读`map` http://perldoc.perl.org/functions/map.html上的文档来了解它 (2认同)