2017-11-15 24 views
9

này ném một lỗi trong Perl v5.20:Tại sao không có nội suy trong `map` BLOCK?

use strict; 
use warnings; 
my @a = (2,3,9); 
my %b = map { "number $_" => 2*$_ } @a; 

Lỗi:

syntax error at a.pl line 4, near "} @a" 
Execution of a.pl aborted due to compilation errors. 

này không:

use strict; 
use warnings; 
my @a = (2,3,9); 
my %b = map { "number ".$_ => 2*$_ } @a; 

Tại sao nội suy $_ không được phép trong map BLOCK ?

+1

Nó không phải là nội suy. Nếu bạn xóa '$ _' khỏi chuỗi nó vẫn ném lỗi. – simbabque

+2

Đặt các dấu ngoặc đơn bên trong BLOCK sẽ giúp ích. – simbabque

+3

@ HåkonHægland vì vậy tôi chỉ có thể viết '{; "số $ _" => 2 * $ _} 'thay vào đó, phải không? – jlovegren

Trả lời

14

map có hai cú pháp:

map BLOCK LIST 
map EXPR, LIST 

Perl phải xác định cú pháp bạn đang sử dụng. Vấn đề là cả hai BLOCKEXPR đều có thể bắt đầu bằng {{ ... } có thể là hàm tạo băm (ví dụ: my $h = { a => 1, b => 2 };).

Điều đó có nghĩa là ngữ pháp của Perl không rõ ràng. Khi gặp phải sự mơ hồ, hãy perl đoán ý của bạn là gì sau khi xem trước một chút. Trong tình huống của bạn, nó đoán sai. Nó đoán { là khởi đầu của một hàm tạo băm thay vì bắt đầu một khối. Bạn sẽ cần định hướng rõ ràng.

Sau đây là cách thuận tiện để disambiguate khối và nhà thầu băm:

+{ ... } # Not a valid block, so must be a hash constructor. 
{; ... } # Perl looks head, and sees that this must be a block. 

Vì vậy, trong trường hợp của bạn, bạn có thể sử dụng

my %b = map {; "number $_" => 2*$_ } @a; 

liên quan: Difference between returning +{} or {} in perl from a function, and return ref or value

+0

'+ {..}' nên ném cùng một lỗi? https://eval.in/900790 –

+1

@ Сухой27, Thông báo lỗi chính xác hơn với '+ {...}', nhưng đó là lỗi tương tự: dấu phẩy được mong đợi sau khi kết thúc biểu thức. – ikegami

Các vấn đề liên quan