2017-11-15 293 views
9

Bu Perl v5.20 hata veren:Neden "map" BLOCK içinde interpolasyon yok?

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

Hata:

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

Bu değildir:

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

Neden map BLOK içinde izin verilmeyen $_ ait değerleme de ?

map BLOCK LIST 
map EXPR, LIST 

Perl hangi kullandığınız sözdizimi belirlemek gerekir:

+1

O değil: Eğer

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

İlgili kullanabilirsiniz sizin durumunuzda Yani

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

:

aşağıdaki

blokları ve karma kurucular belirsizliği giderecek pratik yollardır interpolasyon. Dizeden '$ _ 'öğesini kaldırırsanız, hala hatayı atar. – simbabque

+2

BLOK'un içine parantez koymak yardımcı olacaktır. – simbabque

+3

@ HåkonHægland sadece yazabildiğim '{; "number $ _" => 2 * $ _} 'yerine, değil mi? – jlovegren

cevap

14

map iki sözdizimi vardır. Sorun, BLOCK ve EXPR'un { ile başlayabilmesidir, çünkü { ... } hash yapıcısı olabilir (ör. my $h = { a => 1, b => 2 };).

Bu, Perl'in dilbilgisinin belirsiz olduğu anlamına gelir. Bir belirsizlikle karşılaşıldığında, perl, ileriye baktıktan sonra ne demek istediğinizi tahmin eder. Durumunda yanlış tahmin edildi. {, bir blok başlangıcı yerine bir karma yapıcının başlangıcı olduğunu tahmin etti. Açıkça anlaşmanız gerekir. Difference between returning +{} or {} in perl from a function, and return ref or value

+0

'+ {..}' aynı hatayı atmalı mı? https://eval.in/900790 –

+1

@ Сухой27, Hata iletisi '+ {...}' ile daha hassastır, ancak aynı hatadır: ifadenin sonunda bir virgül bekleniyor. – ikegami