perl – 什么是’sub bar {{_ _ [1] => $_ [2]}}`完全可以吗
我不明白这个例子中的糖迹象在某个地方,
sub bar { +{$_[1] => $_[2]} } 我写了这个,我没有看到任何差异: 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); foo返回 $VAR1 = 55; $VAR2 = undef; 酒吧回来 $VAR1 = { '55' => undef }; 解决方法
它有助于解析器区分匿名哈希和代码块.
引用Learning Perl Objects,References & Modules
或从地图上的文档功能: "{" 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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |