2017-11-15 32 views
9

यह पर्ल v5.20 में एक त्रुटि फेंकता है:क्यों 'मानचित्र' ब्लॉक के भीतर कोई इंटरपोलेशन नहीं है?

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 ब्लॉक के भीतर की अनुमति नहीं क्यों है ?

map BLOCK LIST 
map EXPR, LIST 

पर्ल जो वाक्यविन्यास का उपयोग कर रहे यह निर्धारित करना चाहिए:

+1

यह नहीं है

निम्नलिखित ब्लॉक और हैश कंस्ट्रक्टर्स को स्पष्ट करने के लिए सुविधाजनक तरीके हैं प्रक्षेप। यदि आप स्ट्रिंग से '$ _' हटाते हैं तो यह अभी भी त्रुटि को फेंकता है। – simbabque

+2

ब्लॉक के अंदर कोष्ठक डालने से मदद मिलेगी। – simbabque

+3

@ हाकॉनहेग्लैंड इसलिए मैं बस लिख सकता हूं {{; "संख्या $ _" => 2 * $ _} 'इसके बजाए, है ना? – jlovegren

उत्तर

14

map दो वाक्य रचना है। समस्या यह है कि BLOCK और EXPR दोनों { से शुरू हो सकते हैं क्योंकि { ... } हैश कन्स्ट्रक्टर (उदा। my $h = { a => 1, b => 2 };) हो सकता है।

इसका मतलब है कि पर्ल का व्याकरण संदिग्ध है। जब एक अस्पष्टता का सामना किया जाता है, perl अनुमान लगाता है कि थोड़ा आगे देखने के बाद आपका क्या मतलब है। आपकी स्थिति में, यह गलत अनुमान लगाया। यह अनुमान लगाया गया है कि ब्लॉक की शुरुआत के बजाय हैश कन्स्ट्रक्टर की शुरुआत थी। आपको स्पष्ट रूप से असंबद्ध होना होगा। , आप इस्तेमाल कर सकते हैं

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

संबंधित

+{ ... } # Not a valid block, so must be a hash constructor. 
{; ... } # Perl looks head, and sees that this must be a block. 
अपने मामले में

तो: Difference between returning +{} or {} in perl from a function, and return ref or value

+0

'+ {}} एक ही त्रुटि फेंक देना चाहिए? https://eval.in/900790 –

+1

@ Сухой27, त्रुटि संदेश '+ {...}' के साथ अधिक सटीक है, लेकिन यह वही त्रुटि है: अभिव्यक्ति के अंत के बाद एक अल्पविराम की उम्मीद है। – ikegami

संबंधित मुद्दे