perl-anfaenger-frage

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

perl-anfaenger-frage
hi,

lese gerade ein bisschen in “programming perl” rum, weil ich totaler anfaenger bin, was diese sprache und ihre denkweise angeht. da ist ein tolles beispielprogramm, was ich aus dem kopf geschrieben habe - es kommt aber immer noch ein fehler.

folgendes: eine notendatei mit schuelern a, b, c,d namens “noten”:

a 23
b 43
a 02
c 23
b 34
d 3
b 23
a 23

dazu folgendes tolles statistik-skript:

#!/usr/bin/perl -w

open (NOTEN, "noten") or die ("fehler beim oeffnen der notendatei: $!");

while ($line = <NOTEN>) {
        chomp ($line);
        ($schueler, $note) = split (" ", $line);
        $noten {$schueler} .= $note . " ";
}

foreach $schueler (sort keys %noten) {
        $gesamt = 0;
        $anzahl = 0;

        @allenoten = split (" ", $noten {$schueler});

        foreach $note (@allenoten) {
                $gesamt += $note;
                $anzahl++;
        }

        $durchschnitt = $gesamt / $anzahl;

        print ("schueler $schueler mit folgenden noten: $noten {$schueler} \t durchschnitt: $durchschnitt\n");
}

liefert output

[16:51, 47deg, 600mhz, 100%] steppenwolf@baby:~/documents/perl/programming.perl$  ./notenspiegel.pl
Name "main::noten" used only once: possible typo at ./notenspiegel.pl line 26.
Use of uninitialized value in concatenation (.) or string at ./notenspiegel.pl line 26, <NOTEN> line 8.
schueler a mit folgenden noten:  {a}     durchschnitt: 16
Use of uninitialized value in concatenation (.) or string at ./notenspiegel.pl line 26, <NOTEN> line 8.
schueler b mit folgenden noten:  {b}     durchschnitt: 33.3333333333333
Use of uninitialized value in concatenation (.) or string at ./notenspiegel.pl line 26, <NOTEN> line 8.
schueler c mit folgenden noten:  {c}     durchschnitt: 23
Use of uninitialized value in concatenation (.) or string at ./notenspiegel.pl line 26, <NOTEN> line 8.
schueler d mit folgenden noten:  {d}     durchschnitt: 3

offensichtlich falsch (wegen den fehlern zwischendrin und der fehlenden notenauflistung). wenn ich die ausgabezeile in

        print ("schueler $schueler mit folgenden noten: @allenoten \t durchschnitt: $durchschnitt\n");

abaendere, kommt der korrekte output

[16:51, 47deg, 600mhz, 100%] steppenwolf@baby:~/documents/perl/programming.perl$  ./notenspiegel.pl
schueler a mit folgenden noten: 23 02 23         durchschnitt: 16
schueler b mit folgenden noten: 43 34 23         durchschnitt: 33.3333333333333
schueler c mit folgenden noten: 23       durchschnitt: 23
schueler d mit folgenden noten: 3        durchschnitt: 3

meine frage ist natuerlich, warum die erste version nicht geht - erstens aus prinzip und zweitens, weil sie so im buch steht!

gruesse und danke,
-steppenwolf


check this:

faui02k [~]> perl
my %noten = (2 => 3);
print "$noten {2} $noten{2}\n";

 {2} 3
faui02k [~]> 

es ist $noten{2} != $noten {2} im string-kontext.

wenn ich warnings eingeschaltet haette, dann wuerde ich eine warnung bekommen haben, welche mir dero mitteilt, dass $noten nicht definiert ist. (das ist bei dir der fehler) die naechsten fehler sind dann entsprechend.

am besten ist, nur skalarvariablen im string-kontext zu benutzen, und alle anderen zugriffe auslagern. bei dir also:

print ("schueler $schueler mit folgenden noten: " . $noten{$schueler}  . "\t durchschnitt: $durchschnitt\n");

HTH


Du darfst keine Leerstelle zwischen Deiner Referenz $noten und Deinem Key {$schueler} haben, sonst weiss der Interpreter innerhalb des Strings natuerlich nicht mehr, dass die beiden zusammengehoeren.
Wenn Du keine Leerstelle machst, funktioniert es (generell ist eine Leerstelle zwischen Referenz und Key nicht idiomatisch), d.h. richtig ist

print ("schueler $schueler mit folgenden noten: $noten{$schueler} \t durchschnitt: $durchschnitt\n");

@kabel: sorry fuer die spaete antwort und tausend dank! ist eigentlich logisch und ich werde in zukunft solche zugriffe extra konkatenieren wie du es beschrieben hast.

@miniwahr: auch dir danke fuer die zusaetzliche erklaerung.

@alle: wie schreibt ihr eigentlich euren code - mit eher mehr leerzeichen oder eher weniger? z. b.

print("bla") oder
print ("bla")

$noten[1] oder
$noten [1]

ich finde die version mit leerzeichen besser zu lesen, trotzdem machen die profis es glaube ich ohne, oder? meinungen?


das ist natuerlich geschmackssache, aber eigentlich ist es ueblich, keine Leerzeichen zwischen Funktionensnamen und Argumente bzw. zwischen Arraynamen und Index zu machen


sowas wie: print (“blubb”) kann Probleme mit Makros machen, meine ich gelesen zu haben…

manches kann man mit Leerzeichen besser lesen (Bedingungen), manches ohne (Arrays)…

ich finde $noten [1] komisch und gegen die Leßbarkeit des Codes…


makros in perl? meinst du /SourceFilter/ module?

profis schreiben code immer so, als ob sie bei den nächsten Obfu Wettbewerb gewinnen wollen. :smiley:
perl ist yet another language, setz deinen eigenen coding standard und zieh ihn dann durch.


naja, in C und Perl einen verschiedenen Codingstyle zu verwenden wär ja auch komisch…