2015-07-03 20 views
13

Tôi không hiểu các dấu hiệu + đường trong ví dụ này lấy ở đâu đó trong khi Goggling:

sub bar { +{$_[1] => $_[2]} } 

tôi đã viết này và tôi không thấy bất kỳ sự khác biệt ở đây:

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 lợi nhuận

$VAR1 = 55; 
$VAR2 = undef; 

bar trả về

$VAR1 = { 
      '55' => undef 
     }; 
+2

Bạn đang sử dụng Data :: Dumper, vì vậy tôi đơn giản hóa và làm cho nó Runnable bởi nhiều người – ikegami

Trả lời

16

Nó giúp trình phân tích cú pháp phân biệt giữa băm ẩn danh và khối mã.

Trích dẫn Learning Perl Objects, References & Modules

vì khối và nhà thầu băm nặc danh đều sử dụng dấu ngoặc nhọn trong khoảng cùng một nơi trong cây cú pháp, trình biên dịch đã làm cho quảng cáo hoc quyết định về mà trong hai bạn có ý nghĩa. Nếu trình biên dịch bao giờ quyết định không chính xác, bạn có thể cần phải cung cấp một gợi ý để có được những gì bạn muốn. Để hiển thị trình biên dịch mà bạn muốn có một hàm tạo băm vô danh, hãy đặt dấu cộng trước dấu ngoặc nhọn mở: + {...}. Để chắc chắn để có được một khối mã, chỉ cần đặt một dấu chấm phẩy (đại diện cho một tuyên bố trống) ở đầu khối: {; ...}.

Hoặc từ các tài liệu trên map chức năng:

"{" 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. 
+0

là gì phương thức sử dụng để tìm kiếm này tài liệu? Tôi đã thử goggling 'perl" + {} "và' perl "+ {...}" 'hoặc thậm chí' perl cộng với dấu băm'. Tôi không tìm thấy bất cứ điều gì có liên quan. Ma thuật của bạn là gì? – nowox

+2

Tôi biết 'nó' đọc tài liệu trên 'map' http://perldoc.perl.org/functions/map.html – Sobrique

+0

Tôi googled" perl hash plus sign "và nhận liên kết là lần truy cập đầu tiên. – Matteo