2017-05-22 3 views
9

मैं Map साथ खेल रहा हूँ और मैं एक परिणाम मुझे समझ नहीं आता मिलता है।पर्ल 6 का मानचित्र मुझे एक मामले में एक मूल्य और दूसरी सूची में क्यों देता है?

पहले, मैं Map का निर्माण। कोई बड़ी ललकार:

> my $m = Map.new: '1' => :1st, '2' => :2nd; 
Map.new(("1" => :st(1),"2" => :nd(2))) 

मैं शाब्दिक कुंजी के द्वारा एक भी तत्व का उपयोग और

> $m<1>.^name 
Pair 
> $m<<1>>.^name 
Pair 

सब ठीक है यही कारण है कि। नहीं

> my $n = 1 
1 
> $m<<$n>>.^name 
List 

उस सूची में सही मूल्य नहीं है, लेकिन मुझे लगता है कि मामले में एक List मिल क्यों करते हैं और:

लेकिन, अगर मैं एक चर में महत्वपूर्ण के साथ प्रयास करें, मैं वापस एक List बजाय मिल $m<<1>> मामला?

और, एक बार मैं सूची है, मैं असमर्थ श्रृंखला के लिए एक और सबस्क्रिप्ट यह प्रतीत:

> $m<<$n>>.[0] 
===SORRY!=== Error while compiling: 
Unable to parse quote-words subscript; couldn't find right double-angle quote 
at line 2 
+1

कोई अन्य ((संयुक्त) संबंधित?) असंगतता: '<<1>>^^ नाम # IntStr' बनाम मेरा $ n = 1; <<$n>>^^ नाम # पर्ची 'बनाम' <<1 2>>^^ नाम # सूची' – Christoph

+1

इस बारे में कुछ और सोचने के बाद और मुझे समस्या दिखाने वाले व्यक्ति से बात करने के बाद, मुझे लगता है कि '$ m <<1>> 'वापस आना चाहिए सूची भी तब चीजें समझ में आ जाएंगी। यदि यह एक इंट्सट्र की सूची है, तो यह ठीक है। –

उत्तर

11

मैं मानचित्र

साथ खेल रहा हूँ इस व्यवहार के बारे में Map नहीं है एस और अन्य Associative पर लागू होता है, जैसे Baggy एस और Setty एस।

मुझे उस मामले में एक सूची क्यों मिलती है और $ m < < 1 >> मामले नहीं?

क्योंकि चर एक से अधिक कुंजी हो सकती है कि:

my $m = Map.new: '1' => :1st, '2' => :2nd; 
my $n = '1 2'; 
dd $m«$n» # OUTPUT: «(:st(1), :nd(2))␤» 

तो आश्चर्य को रोकने के लिए, यह हमेशा वापस आने वाले List। अन्यथा आप जो सामान प्राप्त करेंगे वह वैरिएबल की सामग्री के आधार पर अलग-अलग होगा। यह बहुत ही समस्याग्रस्त होगा, if %foo«$n»:exists { … } ठीक काम करेगा जब $n में कोई सफेद जगह नहीं है और उपयोगकर्ता को लगता है कि उनके कोड में कोई समस्या नहीं है, लेकिन तब अचानक अचानक True$n में व्हाइटस्पेस होता है।

आप चर की सामग्री को चाहते हैं हमेशा दोहरे उद्धरण चिह्नों के साथ बोली, एक आइटम के रूप में अंतर्वेशित करने जा यह है, या यह सूचकांक करने के लिए घुंघराले ब्रेसिज़ का उपयोग करें। इस मामले चर में खाली स्थान के पर कोई निर्भरता है के रूप में, आप एक List के बजाय एक ही आइटम मिलता है:

my $m = Map.new: '1' => :1st, '2' => :2nd; 
my $n = '1'; 
dd $m«"$n"».^name; # OUTPUT: «"Pair"␤» 
dd $m{$n}.^name; # OUTPUT: «"Pair"␤» 

और, एक बार मैं सूची है, मैं इसे करने के लिए एक और सबस्क्रिप्ट श्रृंखला में असमर्थ लग रहे हैं:

यह एक बग है। मैंने इसे RT#131341 के रूप में दायर किया।इस दौरान, आप यह कोष्ठक ($m«$n»)[0] में बात enclosing या .head का उपयोग करके वैकल्पिक हल कर सकते हैं: $m«$n».head

और में विसंगति के बारे में ओपी पर क्रिस्टोफ की टिप्पणी को संबोधित करने के:

say <<1>>.^name # IntStr 
my $n = 1; 
say <<$n>>.^name # Slip 
say <<1 2>>.^name # List 

पहले एक एक allomorph है, क्योंकि आपके पास सब कुछ है।

चर के साथ दूसरे मामले अनुक्रमण मामले के लिए के रूप में ही तर्क है: यदि आप एक Slip (एक List के उपवर्ग) मिलता है क्योंकि चर एक से अधिक आइटम हो सकती है और आप संकलक बता सकते हैं आप केवल एक आइटम चाहते हैं द्वारा डबल के हवाले से कि स्ट्रिंग:

:

my $n = '42'; 
dd «"$n"».^name; # OUTPUT: «"IntStr"␤» 

और अंत में, चर एक Slip तो में बदल गया हो बाहरी Iterable में है कि यह चपटा हो जाता है, तो यह है कि «…» में चर interpolating आप एक फ्लैट सूची देना होगा 0

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