Problem mit Array
Peter J. Holzer
hjp at wsr.ac.at
Tue Dec 28 04:40:20 CST 1999
On 1999-12-28 11:02:29 +0100, Peter Seitz jun. wrote:
> Ich hatte starke Probleme mit nachfolgendem Perl-Code. Ich wollte die
> Schluessel aus drei hashes in ein Array speichern, damit ich die
> vorhandenen Schluessel sortieren kann (dabei koennen einige
> Schluessel auch doppelt vorhanden sein).
> Wenn ich nun nur mit @string1 arbeite kommt es vor, dass
> komischerweise nur die Schluessel aus %strings_db_caption nicht auf
> @string1 abgespeichert werden.
>
> @string1 = ();
> while (($text, $help) = each %strings_db) {
> @string1 = (@string1, $text);
> }
> # merge caption database to string_xx hash
> while (($text, $help) = each %strings_db_caption) {
> @string1 = (@string1, $text);
> }
> # merge button database to string_xx hash
> while (($text, $help) = each %strings_db_button) {
> @string1 = (@string1, $text);
> }
>
> Nachdem ich den code wie folgt abgeaendert habe hat es (endlich)
> funktioniert, doch ich verstehe nicht wiso mein obiger Ansatz nicht
> zum richtigen Ergebnis fuehrt.
Ich auch nicht. Der Code schaut richtig aus und bei mir funktioniert er
auch. Wenn ich davor
| %strings_db = ( a1 => A1, a2 => A2, a3 => A3 );
| %strings_db_caption = ( b1 => B1, b2 => B2, b3 => B3 );
| %strings_db_button = ( c1 => C1, c2 => C2, c3 => C3 );
und danach ein
| print "@string1\n";
einfüge ist das Ergebnis
| a1 a2 a3 b1 b2 b3 c1 c2 c3
und das sollte es ja sein.
Offenbar hast Du den Bug schon beseitigt. Ich nehme an, daß im
Originalcode ein »my @string1« zuviel vorkommt oder %strings_db_caption
nicht sichtbar ist. Verwendest Du »perl -w« und »use strict«?
Anmerkung zum Stil: Statt
> while (($text, $help) = each %strings_db) {
> @string1 = (@string1, $text);
> }
kann man auch
| for $text (keys %strings_db) {
| @string1 = (@string1, $text);
| }
schreiben, was IMHO besser zum Ausdruck bringt, daß hier nur die Keys
des Hashes verwendet werden. Außerdem fällt da sofort auf, daß wir die
Elemente eines Arrays (keys %strings_db) einzeln an ein anderes Array
anhängen, was nicht besonders effizient ist. Die ganze schleife läßt
sich also zu
| @string1 = (@string1, (keys %strings_db));
bzw.
| push (@string1, (keys %strings_db));
verkürzen.
hp
--
_ | Peter J. Holzer | Nobody should ever have to be
|_|_) | Sysadmin WSR / Obmann LUGA | ashamed if they have a secret love
| | | hjp at wsr.ac.at | for writing computer programs that
__/ | http://wsrx.wsr.ac.at/~hjp/ | actually work. -- Donald E. Knuth
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 371 bytes
Desc: not available
Url : http://mail.pm.org/archives/vienna-pm/attachments/19991228/862a2b4b/attachment.bin
More information about the Vienna-pm
mailing list