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