2017-12-27 15 views
7

में सूचियों की सूची बनाना मैं एक सरल समाधान की तलाश में हूं।पर्ल 6

मेरे पास संबंधित प्रत्यय और जड़ों की एक सूची के साथ उपसर्गों की एक सूची है।

my @prefixes = 'A'..'E'; 
my @suffixes = 'a'..'e'; 
my @roots = 1, 2; 

मैं हर संभव 'शब्द' बनाने के लिए करना चाहते हैं: A1a, B1b ... A2a ... E2e

my @words; 
for @roots -> $r { 
    for @prefixes.kv -> $i, $p { 
     my $s = @suffixes[$i]; 
     my $word = [~] $p, $r, $s; 
     @words.push: $word; 
    } 
} 
say @words; # [A1a B1b C1c D1d E1e A2a B2b C2c D2d E2e] 

मुझे लगता है कि यह बहुत आसान zip या cross की तरह कुछ का उपयोग कर ऐसा करने के लिए संभव है, लेकिन कैसे को समझ नहीं सकता ...

+1

'((" ए ".." ई "Z" एक ".. "ई") एक्स 1,2)। मैप (-> (($ ए, $ सी), $ बी) {"$ एक $ बी $ सी"}) ' – Christoph

+1

या' (("ए" .. "ई "जेड" एक ".." ई ") एक्स 1,2) .flat.map (* ~ * आर ~ *) ', हालांकि मुझे यकीन नहीं था कि जब तक मैंने कोशिश की, तब तक प्राथमिकता/सहयोगीता के संबंध में कोई काम नहीं करेगा यह ... – Christoph

+0

@ क्रिस्टोफ धन्यवाद! और वास्तव में ऐसा लगता है कि 'रोप' की 'प्राथमिकता' की तुलना में अधिक प्राथमिकता है। [डॉक्स] में [https://docs.perl6.org/language/operators#index-entry-R_reverse_meta_operator), केवल एक गुप्त वाक्यांश है: "ऑपरेंड की एसोसिएटिविटी भी उलट जाती है"। –

उत्तर

8

कुछ और तरीके यह लिखने के लिए:


say @roots X[&join] (@prefixes Z @suffixes); 

say @roots.map({ |(@prefixes Z @suffixes)».join($_) }); 

say @roots.map({ (@prefixes X~ $_) Z~ @suffixes }).flat; 

say (|@prefixes xx *) Z~ (@roots X~ @suffixes); 

my @formats = (@prefixes Z @suffixes).flat.map(* ~ '%s' ~ *); 
say @formats X[&sprintf] @roots; 

(नोट:। यह एक उन्हें एक अलग क्रम में प्रिंट)


say do for @roots -> $root { 
    |do for (@prefixes Z @suffixes) -> [$prefix, $suffix] { 
     $prefix ~ $root ~ $suffix 
    } 
} 
+0

धन्यवाद, पहला समाधान सबसे स्पष्ट है! और इस प्रश्न के सभी अलग-अलग समाधान पर्ल 6 का एक मिनी-एनसाइक्लोपीडिया प्रदान करते हैं :) –

10

मेरे समाधान होगा:

say @roots.map: |(@prefixes >>~>> * <<~<< @postfixes); 

मेटाओपिंग कॉन्सटेनेशन के लिए जो भीकोड बनाएं, परिणाम को Seq प्राप्त करने के लिए अंत में केवल स्केलर मान प्राप्त करें।

+0

यह एक अद्भुत समाधान है, धन्यवाद! –

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