2011-06-10 16 views
8

योजना में साथ आप for-each साथ में एकाधिक सूचियों से अधिक पुनरावृति कर सकते हैं:के लिए कई सरणियों

> (for-each (lambda (a b) (display (+ a b)) (newline)) '(10 20 30) '(1 2 3)) 
11 
22 
33 
> 

मुझे पता है कि पर्ल में आप for उपयोग कर सकते हैं एक सूची से अधिक पुनरावृति करने के लिए। योजना उदाहरण में कई सूचियों पर फिर से शुरू करने का एक अच्छा तरीका क्या है?

मैं पर्ल 5 या 6

उत्तर

9

देखें पर्ल 5 में आप मॉड्यूल List::MoreUtils उपयोग कर सकते हैं। या तो pairwise या iterator के साथ प्रत्येक_एरे द्वारा लौटाया जाता है (जो समानांतर में दोहराए जाने के लिए दो से अधिक सरणी ले सकता है)।

use 5.12.0; 
use List::MoreUtils qw(pairwise each_array); 

my @one = qw(a b c d e); 
my @two = qw(q w e r t); 

my @three = pairwise {"$a:$b"} @one, @two; 

say join(" ", @three); 

my $it = each_array(@one, @two); 
while (my @elems = $it->()) { 
    say "$elems[0] and $elems[1]"; 
} 
1

एक ही रास्ता के लिए उत्तर में दिलचस्पी रखता हूँ है:

sub for_each 
{ 
    my $proc = shift ; 

    my $len = @{$_[0]} ; 

    for (my $i = 0 ; $i < $len ; $i++) 
    { 
     my @args = map $_->[$i] , @_ ; 

     &$proc (@args) ; 
    } 
} 

for_each sub { say $_[0] + $_[1] } , ([10,20,30],[1,2,3]) 

each_arrayref का उपयोग करना List::MoreUtils से:

sub for_each 
{ 
    my $proc = shift ; 

    my $it = each_arrayref (@_) ; 

    while (my @elts = $it->()) { &$proc (@elts) } ; 
} 

for_each sub { say $_[0] + $_[1] } , ([10,20,30],[1,2,3]) 

List::MoreUtils ओर इशारा करते हुए के लिए एलेक्स के लिए धन्यवाद ।

6
पिन ऑपरेटर आप प्राप्त कर सकते हैं कि आप क्या योजना के साथ कर रहे हैं के साथ

:

> .say for (10, 20, 30) Z+ (1, 2, 3) 
11 
22 
33 

http://perlcabal.org/syn/S03.html#Zip_operators

+0

धन्यवाद tadzik के रूप में फिर से लिखने सकता है (निश्चित रूप से यह एक Perl6 जवाब है)। प्रत्येक के लिए योजना 1 या अधिक सूचियों को सामान्यीकृत करती है। ज़िप दो से अधिक सूचियों के लिए इस्तेमाल किया जा सकता है? – dharmatech

+2

यह हो सकता है, हालांकि राकुडो वर्तमान में केवल दो सूचियों (ज्ञात सीमा) के लिए लागू करता है। – moritz

+1

अब किसी भी सूची के लिए काम करता है। – raiph

2

तुम बस सरणियों के सूचकांक से अधिक पुनरावृति सकता है, यदि आप सुनिश्चित करें कि वे एक ही आकार रहे हैं कर रहे हैं: वेरिएंट के साथ

foreach(0 .. $#array1) { 
    print $array1[$_] + $array2[$_], "\n"; 
} 
2

Algorithm::Loops कई सरणियों से अधिक पुनरावृत्ति के लिए एक MapCar समारोह प्रदान करता है (वह असमान आकार के सरणी के साथ अलग-अलग सौदा करता है)।

10

पर्ल 6 में, ज़िप ऑपरेटर सबसे अच्छा विकल्प है। तुम दोनों मूल्यों को प्राप्त करने के लिए (और नहीं राशि सीधे गणना) चाहते हैं तो आपको यह धन चिह्न के बिना उपयोग कर सकते हैं:

for (10, 11, 12) Z (1, 2, 3) -> $a, $b { 
    say "$a and $b"; 
} 
+0

धन्यवाद मोर्टिज़! Tadzik के जवाब पर मेरी टिप्पणी देखें। – dharmatech

0

एक समाधान (वहाँ से चुनने के लिए कई हैं) इस प्रकार दिखाई देंगे:

my @argle = (10, 20, 30); 
my @bargle = (1, 2, 3); 
do { 
    my $yin = shift @argle; 
    my $yang = shift @bargle; 
    say $yin + $yang; 
} while (@argle && @bargle); 

मैं समझ है कि आप, foreach के बारे में पूछ रहे हैं इस प्रकार दिखाई देंगे जो:

my @argle = (10, 20, 30); 
my @bargle = (1, 2, 3); 
for my $yin (@argle) { 
    my $yang = shift @bargle; 
    say $yin + $yang; 
} 

लेकिन यह इस मामले में के रूप में चिकनी नहीं है। यदि सरणी कम है तो क्या होता है?

1

जब तक सवाल सिर्फ जोड़ने (/ गुणा, विभाजित, ...) और सरणी सरणी का कोई सरणी के रूप में, आप भी अपने कार्य के लिए अति ऑपरेटरों इस्तेमाल कर सकते हैं के रूप में सरल है:

<1 2 3> «+» <10 20 30> 

आप फ्रेंच उद्धरण «» के लिए पहुँच नहीं है, तो आप यह

<1 2 3> <<+>> <10 20 30> 
संबंधित मुद्दे