Schrift
[thread]12606[/thread]

Elemente aus Array entfernen

Leser: 1


<< >> 5 Einträge, 1 Seite
Norma
 2008-10-09 12:54
#115289 #115289
User since
2008-10-08
4 Artikel
BenutzerIn
[default_avatar]
Die Lösung von pq funktioniert wunderbar! Vielen Dank!

Liebe Grüße
Norma
Gast Gast
 2008-10-08 19:54
#115311 #115311
Hallo zusammen,

kann mir bitte jemand helfen. Ich habe ein Array, dessen Elemente eins nach dem anderen abgearbeitet werden müssen. Wenn eine Bedingung auf ein Element zutrifft, wird damit eine bestimmte Aktion durchgeführt und danach muss das Element entfernt werden. Auf diese Weise muss das ganze Array abgearbeitet werden, dabei wird die Liste mit jedem Durchlauf der Schleife kleiner. Hier das Code-Beispiel:

Code (perl): (dl )
1
2
3
4
5
6
foreach $element ( @elements ) {
    if ( $element = BEDINGUNG ) {
        AKTION;
        ENTFERNE_ELEMENT;
    }
}


Hat jemand eine Idee, wie "ENTFERNE_ELEMENT" aussehen kann? Ich hoffe, ich konnte es verständlich erklären.

Grüße
Norma
pq
 2008-10-08 20:07
#115312 #115312
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
das geht mit einem kleinen trick, indem du rückwärts über das array läufst:
Code (perl): (dl )
1
2
3
4
5
6
7
8
# laufe rückwärts über die indizes
for my $i (reverse 0 .. $#elements) {
    # bedingung trifft zu
    if ( bedingung($elements[$i]) ) {
        # entferne genau ein element ein stelle $i
        splice @elenents, $i, 1;
    }
}

würde man stattdessen vorwärts laufen, würde man die elemente, die man erst
später erreicht, nach vorne verschieben und so teilweise überspringen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pktm
 2008-10-08 20:18
#115313 #115313
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Oder man legt ein neues Array an:
Code: (dl )
1
2
3
4
5
6
7
8
my @neu = ();
foreach my $element ( @elements ) {
if ( $element == BEDINGUNG ) {
AKTION;
}else{
push @neu, $element;
}
}
http://www.intergastro-service.de (mein erstes CMS :) )
sid burn
 2008-10-09 15:56
#115322 #115322
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Das geht auch mit map.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my @values = 1 .. 10;

@values = map {
if ( $_ % 2 ) { # bedingung
print "aktion: $_\n"; # aktion
(); # entferne
}
else {
$_
}
} @values;

print "@values\n";


oder in der foreach einen "speziellen" wert zuteilen und dann nachher mit grep diesen speziellen Wert ausfiltern.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my $ENTFERNE = [];
my @values = 1 .. 10;

for my $value ( @values ) {
if ( $value % 2 ) {
print "aktion: $value\n";
$value = $ENTFERNE;
}
}

@values = grep { !( ref $_ eq 'ARRAY' && $_ == $ENTFERNE ) } @values;

print "@values\n";
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< >> 5 Einträge, 1 Seite



View all threads created 2008-10-08 19:54.