2017-11-15 2 views
9

これはPerlのV5.20でエラーがスローされます:なぜ `map`ブロック内に補間がありませんか?

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

エラー:

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

これにはない:

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

なぜmapブロック内で許可されていない$_の補間があります?

​​

のPerl、使用している構文を決定する必要があります。

+1

そうではありません補間。 '$ _'を文字列から削除すると、それでもエラーがスローされます。 – simbabque

+2

BLOCKの中にかっこを入れると便利です。 – simbabque

+3

@HåkonHæglandだから、 '{; "number $ _" => 2 * $ _} '代わりに、そうですか? – jlovegren

答えて

14

mapは、二つの構文があります。問題は、{ ... }がハッシュコンストラクタ(例:my $h = { a => 1, b => 2 };)になる可能性があるため、BLOCKEXPRの両方が{で始まることです。

つまり、Perlの文法はあいまいです。あいまいさに遭遇すると、少し先を見て、あなたが意味することをperlは推測します。あなたの状況では、それは間違っていた。それは、ブロックの開始ではなく、ハッシュコンストラクタの開始点であると推測しました({)。あなたは明確に明確にする必要があります。

次はブロックとハッシュコンストラクタを明確にするために便利な方法です:

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

は、だからあなたの場合には、あなたは関連

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

を使用することができます:Difference between returning +{} or {} in perl from a function, and return ref or value

+0

'+ {..}'は同じエラーを投げますか? https://eval.in/900790 –

+1

@Сухой27、エラーメッセージは '+ {...} 'でより正確ですが、それは同じエラーです:式の終わりの後にカンマが必要です。 – ikegami

関連する問題