Array aufsplitten

Hi,
ich suche noch eine elegante, schöne Möglichkeit ein Array aufzusplitten. Wenn man ein Array hat soll der erste Eintrag in @array1 landen, der nächste in @array2, dann wieder der nächste in @array1 etc.

Man kann sicherlich solch eine for Schleife nutzen:

for my $schlagwort ( @flach\_a ) {
 if ( $even ) {
 push @rows, $schlagwort;
 $even = 0;
 }
 else {
 push @rows2, $schlagwort;
 $even = 1;
 }
}

Aber das ist viel Code für etwas kleines. Andere Möglichkeit wären zwei maps.

my @a1 = map { if ( $\_ % 2 ) { $flach[$\_] } else { () } } 0 .. $#flach;
my @a2 = map { if ( $\_ % 2 ) { () } else { $flach[$\_] } } 0 .. $#flach;

Allerdiengs stört es irgendwie das ganze Array zweimal durchzugehen. Und erweiterbar ist es auch nicht so ganz. Möchte man es auf 6 Arrays aufteilen, benötigt man sechs maps, und muss sechs mal das array durchgehen.

Also dann. Kennt noch jemand schöne, kurze Möglichkeiten?

ich suche noch eine elegante, schöne Möglichkeit ein Array
aufzusplitten. Wenn man ein Array hat soll der erste Eintrag
in @array1 landen, der nächste in @array2, dann wieder der
nächste in @array1 etc.

my @array = qw(a b c d e f g h i j k l);
my (@odd, @even);
for (0 .. $#array) {
 push @{ $\_ & 1 ? \@odd : \@even }, $array[$\_];
}

Hallo

ich suche noch eine elegante, schöne Möglichkeit ein Array
aufzusplitten. Wenn man ein Array hat soll der erste Eintrag
in @array1 landen, der nächste in @array2, dann wieder der
nächste in @array1 etc.

 my @flach\_a = 'a'..'z';
 my(@rows, @rows2);

 push(@rows, shift @flach\_a)
 ,push(@rows2, shift @flach\_a)
 # enter more arrays here
 while @flach\_a;


 print "@rows\n@rows2\n";

Grüße

CMБ

my @flach_a = ‚a‘…‚z‘;
my(@rows, @rows2);

push(@rows, shift @flach_a)
,push(@rows2, shift @flach_a)

enter more arrays here

while @flach_a;

print „@rows\n@rows2\n“;

ich nehme an, das ist kein pseudocode, sondern laeuft tatsächlich?

zuerst dachte ich ja, da fehlt irgendwas was loopt, aber nein, ich hatte das while uebersehen. und oha, das komma vor dem 2. push macht dann wohl wieder einen listenkontext? und das while ist so ein wuschiger rightward listooperator? so dass das while dann doch noch die zeile sauber beendet?

Hallo,

zuerst dachte ich ja, da fehlt irgendwas was loopt, aber nein,
ich hatte das while uebersehen. und oha, das komma vor dem 2.
push macht dann wohl wieder einen listenkontext?

Nein, das packt zwei Ausdrücke in einen Zusammen.
Also statt

foo() while @bar;

schreibt er hier

foo(), bar while @bar

was man auch als

while(@bar){
 foo();
 bar();
}

schreiben könnte. Mit Listenkontext hat das erst mal nicht viel zu tun.

Grüße,
Moritz

Hallo,

ich nehme an, das ist kein pseudocode, sondern laeuft
tatsächlich?
zuerst dachte ich ja, da fehlt irgendwas was loopt, aber nein,
ich hatte das while uebersehen. und oha, das komma vor dem 2.
push macht dann wohl wieder einen listenkontext? und das while
ist so ein wuschiger rightward listooperator? so dass das
while dann doch noch die zeile sauber beendet?

Wie Moritz schon andeutete, das ist
die ‚more perlish‘ Form von

my @flach\_a = 'a'..'z';
my(@rows, @rows2);

 while( @flach\_a ) { # Skalarkontext =\> Anzahl der Elemente 0 / !=0
 push @rows, shift @flach\_a; # ziehe element i von
 push @rows2, shift @flach\_a; # ziehe element i+1
 }

 print "@rows\n@rows2\n";

ergänzt durch die
kreative Anwendung des Kommaoperators.

Grüße

CMБ