perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 19
Click for quality!




12.02.2012 / 02:20

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragInkonsistentes Verhalten
Seitenanfang
Hallo zusammen.
Folgendes ist mir eben passiert:

@array = 1..100;
foreach (@array){
$array[$_] = ($_-XXX)."\n";
}
print @array;

Das "XXX" steht für eine Zahl.

Wenn ich eine ungerade Zahl einsetze, z.B. die Zahl 5, wird folgendes ausgegeben:
Erste zehn Zeilen:
-5
-4
-3
-2
-1
0
1
2
3
4
...
Letzte zehn Zeilen
82
83
84
85
-14
9388
9590
-9
9893
10095

Wenn ich eine gerade Zahl einsetze, z.B. die Zahl 4, wird folgendes ausgegeben:
Erste zehn Zeilen:
1-3
3-1
51
73
95
117
139
1511
1713
1915
...
Letzte zehn Zeilen:
...
8177
8379
8581
8783
8985
9187
9389
9591
9793
9995

Bei ungeraden Zahlen finde ich es in diesem Beispiel bis zur Ausgabe "84" noch logisch. Alles andere schreit nach einem Kaffee am Montag morgen.

Die ursprüngliche Idee war folgende:

$array[$_] = $_."\n";

Jedem Eintrag sollte ein Newline-Zeichen angehängt werden. Die Ausgabe aber:
11

33

55
...
9999

Ich vermutete ein Problem beim Unterschied zwischen der ersten Array-Adresse [0] und dem ersten Eintrag im Array (1). Also [0] = 1. Daher hatte ich mit dem Subtrairen angefangen.

Quizfrage: Wer hat eine Erklärung für das oben beschriebene Verhalten?

Datum: 23.11.2009-11:05

Beitragre: Inkonsistentes Verhalten
Seitenanfang
du manipulierst das Array, durch welches du iterierst. Das fuehrt natuerlich zu Problemen:

my @array;
foreach (1..100){
push(@array, ($_-5)."\n");
}
print @array;

Datum: 24.11.2009-16:45

Beitragre: Inkonsistentes Verhalten
Seitenanfang
Du machst den Fehler, dass Du die Werte veränderst, über die Du iterierst.

Gehen wir das mal an Hand von einem Array mit 5 Elementen und XXX = 3 durch:

Nach der Initialisierung sieht das Array so aus

$array[0] = 1
$array[1] = 2
$array[2] = 3
$array[3] = 4
$array[4] = 5

Jetzt iterierst Du mit dem "foreach" über die *Werte* in dem Array und nicht über den Index.

Erster Schleifendurchlauf:

$_ = 1 (weil Wert erstes Element im Array = 1)
$array[1] = (1 - 3) . "\n";

Das Array sieht jetzt so aus:

$array[0] = 1
$array[1] = -2
$array[2] = 3
$array[3] = 4
$array[4] = 5

Zweiter Schleifendurchlauf

$_ = -2 (weil Wert zweites Element im Array = -2)
$array[-2] = (-2 - 3) . "\n";

Das Array sieht jetzt so aus:

$array[0] = 1
$array[1] = -2
$array[2] = 3
$array[3] = -5
$array[4] = 5

Dritter Schleifendurchlauf

$_ = 3
$array[3] = (3 - 3) . "\n";

Das Array sieht jetzt so aus:

$array[0] = 1
$array[1] = -2
$array[2] = 3
$array[3] = 0
$array[4] = 5

Vierter Schleifendurchlauf

$_ = 0
$array[0] = (0 - 3) . "\n";

Das Array sieht jetzt so aus:

$array[0] = -3
$array[1] = -2
$array[2] = 3
$array[3] = 0
$array[4] = 5

fünfter Schleifendurchlauf

$_ = 5
$array[5] = (5 - 3) . "\n";

Das Array sieht jetzt so aus:

$array[0] = -3
$array[1] = -2
$array[2] = 3
$array[3] = 0
$array[4] = 1
$array[5] = 2

Jetzt haben manche Elemente noch einen Zeilenumbruch, so dass eine "komische" Ausgabe kommt.

Perl macht also alles richtig...

Datum: 24.11.2009-16:50

Beitragre: Inkonsistentes Verhalten
Seitenanfang
Vielen Herzlichen Dank für die genaue Darstellung, Renée.

Na, da hab ich ja einen feinen Montags-Quelltext produziert :)
Mit $array[$_-1]=$_."\n" wäre mir an der Stelle wohl geholfen gewesen. Aber sobald die Werte nicht mehr 1..100 sind, nützt auch das nichts.

fueri umgeht mit seiner Lösung das Problem komplett, vielen Dank auch dafür.

Viele liebe Grüße und bis zum nächsten mal,
Andreas

Datum: 30.11.2009-11:56

-






-
-