Hash: split, map oder was?
am 05.07.2007 17:23:08 von unknownPost removed (X-No-Archive: yes)
Post removed (X-No-Archive: yes)
Martin Trautmann:
> Im Moment verwende ich dafuer mehrere Ersetzungen und eigene Zaehlers, um
> es in mehreren Arrays abzulegen. Ich vermute, das wuerde ueber ein paar
> Hash-Befehle weitaus einfacher gehen. map habe ich aber noch nicht
> wirklich kapiert.
[...]
Ich glaube nicht, dass du "map" hier brauchst:
my $zeile = "a:1 d: 2 f: 3";
my %hash;
$zeile =~s/(\w+):\s+(\d+)\s*/$hash{$1} = $2/ge;
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Post removed (X-No-Archive: yes)
Martin Trautmann:
>> $zeile =~s/(\w+):\s+(\d+)\s*/$hash{$1} = $2/ge;
>
> Oh, danke, das geht ja noch einfacher!
Ja, ich bin draufgekommen, dass man mit s/../../ge erstaunlich
viel machen kann, wofür man sonst "map" oder ein anderes
Schleifenkonstrukt brauchen würde. Es lohnt sich, da ein bißchen
Gehirnschmalz zu investieren, mit der Zeit bekommt man dann
schon Übung. ;-)
PS: $zeile enthält nach der Substitution das Ergebnis der
Zuweisungen, im Beispiel also "123". Wenn du den Inhalt
noch weiter brauchst, muss du ihn daher vorher kopieren.
> map habe ich aber noch nicht wirklich kapiert.
@x = map {...} @y;
ist (im Prinzip) dasselbe wie
foreach @y {
...
push @x,...;
}
d..h, für jedes Element in @y wird im Codeblock dessen Wert
in $_ zur Verfügung gestellt. Der vom Codeblock zurückgelieferte
Wert wird dann an @x als neues Element angehängt.
Das ist allerdings etwas ungenau formuliert, denn der Codeblock
kann auch eine Werteliste (und auch eine leere Liste) zurückliefern,
d.h., die Anzahl an Elementen in @x nach der Abarbeitung
von map kann gleich, höher oder niedriger sein als die in @y.
Wie auch in foreach ist $_ innerhalb des map-Blocks ein Alias
auf das jeweilige Element in @y, d.h., eine Änderung von $_
ändert das betreffende Arrayelement.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
On 2007-07-05 15:23, Martin Trautmann
> Im Moment verwende ich dafuer mehrere Ersetzungen und eigene Zaehlers, um
> es in mehreren Arrays abzulegen. Ich vermute, das wuerde ueber ein paar
> Hash-Befehle weitaus einfacher gehen. map habe ich aber noch nicht
> wirklich kapiert.
Hashes und map haben nichts miteinander zu tun.
> Beispiel:
> Name Wert Name Wert Name Wert
> a: 1 d: 2 f: 3
> b: 4 e: 5
> c: 6
>
>
> Ziel:
> a -> 1
> b -> 4
> c -> 6
> d -> 2
> e -> 5
> f -> 3
>
> Im Moment pruefe ich iterativ, ob in einer Zeile
> (\a+): *(\d+)
> vorkommt, nehme den Teil aus der Zeile, weise das $name[$i] und
> $value[$i++] zu,
Also:
$name[$i] = $1;
$value[$i++] = $2;
Statt den zwei Arrays kannst Du ein Hash %valueof verwenden und
$valueof{$1} = $2;
zuweisen.
> nehme die aus der aktuellen Zeile raus, pruefe den Rest der Zeile und
> mache mit der naechsten Zeile weiter, wenn kein solches Paar mehr
> drinsteckt.
Das bleibt gleich.
> Dann wird $i nach $name sortiert und das Array in der neuen
> Sortierfolge mit einem foreach $j mit $name[$j] und $value[$j]
> ausgegeben.
Das wird dann auch einfacher
for my $n (sort keys %valueof) {
print "$n -> $valueof{$n}\n";
}
hp
--
_ | Peter J. Holzer | I know I'd be respectful of a pirate
|_|_) | Sysadmin WSR | with an emu on his shoulder.
| | | hjp@hjp.at |
__/ | http://www.hjp.at/ | -- Sam in "Freefall"