Thread s/// in map? - Arrayzuweisung kürzer schreiben (12 answers)
Opened by Sven_123 at 2011-03-08 10:31

Taulmarill
 2011-03-08 10:48
#146300 #146300
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
map solltest du nur verwenden, wenn das Ergebnis in einer anderen Variable gespeichert werden soll. Willst du die Werte in dem Array selbst verändern, ist eine for-Schleife genau richtig. Wenn du mit for über einen Array iterierst, dann wird der Wert aus dem Array nicht einfach in die Schleifenvariable kopiert sondern sie repräsentiert das Feld des Arrays, alles was du mit der Variable machst, wirkt sich auf das Array aus. Du kannst also so was machen:
Code (perl): (dl )
1
2
3
4
5
for my $element ( @bsp ) {
    my @vals = split /\s+/, $element;
    $vals[4] =~ s/\.txt$//;
    $element = {$vals[4] => [$vals[2],$vals[3]]};
}


edit: außerdem empfiehlt es sich oft, die Rückgabe von split in entsprechend benannte Variablen zu speichern, anstatt einfach alles in einen Array zu packen, so behält man leichter den Überblick. Nicht benötigte Werte braucht man dann an der Stelle auch gar nicht speichern:
Code (perl): (dl )
1
2
3
4
5
for my $element ( @bsp ) {
    my( undef, undef, $Zahl, $andereZahl, $name )  = split /\s+/, $element;
    $name =~ s/\.txt$//;
    $element = {$name => [$Zahl, $andereZahl]};
}


2nd edit: und hier noch eine Möglichkeit, die Werte direkt per RegEx zu extrahieren ohne split:
Code (perl): (dl )
1
2
3
4
for my $element ( @bsp ) {
    my( $Zahl, $andereZahl, $name ) = $element =~ /(\d+)\s+(\d+)\s+(.+)\.txt$/;
    $element = {$name => [$Zahl, $andereZahl]};
}

Last edited: 2011-03-08 10:57:06 +0100 (CET)
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B

View full thread s/// in map? - Arrayzuweisung kürzer schreiben