Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12668[/thread]

Nur die ersten x in einem Array



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
FoolAck
 2008-10-23 22:13
#115125 #115125
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Die splice-Lösung entfernt aber die ersten 10 Elemente des Arrays. Bin mir nicht sicher, ob das gewollt ist.
Man könnte zwar statt @array einfach @{ [@array] } nehmen, aber irgendwie sieht das auch nicht so schön aus.
Gast Gast
 2008-10-23 00:55
#115705 #115705
Hallo Freunde der Sonne,

Ich stehe total auf dem Schlauch. Ich will in einer Schleife nicht alle Elemente eine Arrays abarbeiten und dann die Schleife verlassen, sondern nur x Elemente. Also genauer 10 Elemente.

Normalerweise schreibe ich for my $i(@array) {...}
Aber wie kann ich mich dabei nur auf die ersten x Elemente beschränken???


Beste Grüße aus dem kalten Berlin.
jan
 2008-10-23 01:26
#115706 #115706
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
for(my $i = 0; $i < scalar @array && $i < 10; $i++)
{
print $array[$i] . "\n";
}


? ich bin unsicher, ob's das ist, was du willst.
cbxk1xg
 2008-10-23 01:40
#115708 #115708
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Ich war wohl nicht eingeloggt. Danke, ich hab's jetzt anders gelöst. Aber ich müßte das Array vorher noch per Zufall durchmischen und habe mal etwas probiert, was ich per Google gefunden habe:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
sub fisher_yates_shuffle
{
my $array = shift;
my $i;
        for ($i = @$array; --$i;)
        {
        my $j = int rand($i+1);
        next if $i == $j;
        @$array[$i,$j] = @$array[$j,$i];
        }
}


Leider variiert nun komischerweise die Gesamtanzahl der Elemente. Mal sind es drei weniger, mal nur eines weniger??? Ich verstehe das nicht.
lichtkind
 2008-10-23 01:50
#115709 #115709
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
dein code gibt für mich keinen sinn. was willst du erreichen.

statt
Code (perl): (dl )
1
2
3
for(my $i = 0; $i < scalar @array && $i < 10; $i++) {
        print $array[$i] . "\n";
}

fürd ich auch eher schreiben:

Code (perl): (dl )
1
2
my $l = 10 > @array ? 10 : @array;
for my $i (1..$l) { ... }
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
LanX-
 2008-10-23 02:22
#115710 #115710
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use List::Util qw( min );

for my $v ( @arr[ ( 0 .. min(9,$#arr) ) ] ) {
    print $v;
}

# oder lesbarer

for my $i ( 0 .. min($#arr,9) ) {
    my $v=$arr[$i];
    print $v;
}
Linuxer
 2008-10-23 02:31
#115711 #115711
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Gast+2008-10-22 22:55:58--
Hallo Freunde der Sonne,

Ich stehe total auf dem Schlauch. Ich will in einer Schleife nicht alle Elemente eine Arrays abarbeiten und dann die Schleife verlassen, sondern nur x Elemente. Also genauer 10 Elemente.

Normalerweise schreibe ich for my $i(@array) {...}
Aber wie kann ich mich dabei nur auf die ersten x Elemente beschränken???


Beste Grüße aus dem kalten Berlin.


Meine Gedanken dazu:

Variante 1:
Code (perl): (dl )
1
2
3
4
5
6
my $max_count = 10;

for my $idx ( 0 .. $#array ) {
  # do whatever
  last if $idx >= $max_count;
}


Variante 2:
# WARNUNG: Wie weiter unten von FoolAck angemerkt werden hierbei die ersten 10 Elemente aus dem Array entfernt!

Code (perl): (dl )
1
2
3
4
5
my $max_count = 10;

for my $elem( splice( @array, 0, $max_count ) ) {
  # do whatever
}
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Gast Gast
 2008-10-23 09:27
#115714 #115714
wie von LanX nur ohne Modul:

Code (perl): (dl )
for my $i (@array[0..(@array<10?$#array:10)]){ }


manachmal ist das auch ganz praktisch:
Code (perl): (dl )
1
2
3
4
5
6
7
my @temp=@array;
while(my $i=shift(@temp))
{
  last if(@temp+10<@array);
  # ...
}
undef(@arraytemp);
LanX-
 2008-10-23 16:39
#115721 #115721
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Gast+2008-10-23 07:27:13--
wie von LanX nur ohne Modul:


List::Util ist core und steigert die lesbarkeit!

Ich hab auch immer die Tendenz möglichst Einbindungen einzusparen, aber sonst endet man dann dabei min/max zu reimplementieren.

die Splicelösung gefällt mir am besten...
Linuxer
 2008-10-23 22:39
#115734 #115734
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
FoolAck+2008-10-23 20:13:37--
Die splice-Lösung entfernt aber die ersten 10 Elemente des Arrays. Bin mir nicht sicher, ob das gewollt ist.


von mir nicht. Hab ich gestern nicht dran gedacht.
FoolAck++;

FoolAck+2008-10-23 20:13:37--
Man könnte zwar statt @array einfach @{ [@array] } nehmen, aber irgendwie sieht das auch nicht so schön aus.


Hm, bevor ich solche Brücken baue, um splice() nutzen zu können, bevorzuge ich andere Lösungen.

Variante mit Slicing:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
#! /usr/bin/perl -l
use strict;
use warnings;

my @array = ( 1..3 );
my $max = 5;

for ( @array[0..$max-1] ) {
  last if !defined;
  print;
}


Bisher ist mein Favorit immer noch meine Variante 1 von gestern ;)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2008-10-23 00:55.