ABSTRACT: perl: einfache while schleifen zum zaehlen und lesen von stdin werden erklaert. AUDIENCE: perl beginners SYSTEM: any unix SECTION: perl AUTHOR: mond COPYRIGHT: GNU Free Documentation Licence http://www.gnu.org/licenses/fdl.txt wir sezten unsere kurzeinfuehrung in perl heute mit einfachen schleifen fort. am besten gleich an einem beispiel: #!/usr/bin/perl -w $zaehler=1; while ( $zaehler < 7 ) { print "der wert der variablen zaehler ist $zaehler\n" ; $zaehler = $zaehler + 1 ; sleep(1); } wenn wir obiges programm ausfuehren (auf chmod ugo+rx nicht vergessen) dann gibt es 6 zeilen aus. der teil in der eckigen klammer hinter dem while () wird solange durchlaufen solange die bedingung in der runden klammer erfuellt ist. anstatt: $zaehler=$zaehler+1 koennten wir auch $zaehler++; schreiben. das ist eine abgekuerzte schreibweise fuer $zaehler=$zaehler+1 ist praktisch weil man oft variablen um 1 erhoehen muss. (C programmierer kennen das schon) das sleep(1); schlaeft eine sekunde. ich hab das eingebaut damit das ganze nicht so schnell durchlaueft. weil das ganze so einfach war gleich noch ein beispiel: #!/usr/bin/perl -w while( ) { chomp ; print "die gelesene zeile war: $_\n" ; } obiges programm ist ein filter das werte von STDIN liest und nacht STDOUT schreibt. der ausdruck liest jeweils eine zeile aus dem "file" STDIN und speichert es in der speziellen variable $_. der ausdruck ist solange wahr solange noch zeilen da sind die man lesen kann. haben wir obiges programm z.b. in dem file test.pl gespeichert so erzeugt: echo bla bla| ./test.pl folgende ausgabe: die gelesene zeile war: bla bla interessant in obigem perl programm ist auch der "chomp" befehl. er entfernt ein allfaelliges zeilende zeichen von $_. bei der ausgabe wir das ohnehin wieder mit dem "\n" hinten angefuegt. wollen wir jetzt z.b. ein programm schreiben dass alle zeilen mit einer zeilennummern voran ausgibt so wuerde das so aussehn: #!/usr/bin/perl -w $znr=1; while( ) { chomp ; print "$znr: $_\n" ; $znr++; } zu beachten: wir verwenden hier wieder die moeglichkeit von perl dass variablen in einen string hineinsubstituiert werden. in weniger fortgeschrittenen programmiersparchen muessten wir das anders machen. man kann es aber auch in perl anders machen: print $znr , ": " , $_ , "\n" ; oben wird print mit mehreren argumenten hintereinadner aufgerufen die mit beistrich getrennt sind. beim ausgeben fuegt es alle hintereinadner zusammen. kennen wir ja schon aus der ersten perl lektion. so zum abschluss noch 2 andere arten wie man schleifen machen kann. anstatt while verwenden (vorallem alte C programmierer) gerne eine for schleife: #!/usr/bin/perl -w for ( $alter=10 ; $alter > 0 ; $alter-- ) { print "der wert der variablen alter ist " , $alter , "\n" ; sleep(1); } eine vorschleife hat in der runden klammer (), wo die while schleife nur eine bedingung hat, 3 teile die mit ; getrennt sind. * der erste teil (oben $alter=10) wird nur einmal am beginn der for-schleife ausgefuehrt. * der mittlere teil ist wie in der while schleife die bedingung die abgeprueft wird und die erfuellt sein muss damit die schleife weiter ausgefuehrt wird. * der letzte teil wird nach jedem schleifen durchlauf ausgefuehrt (ist also wie wenn er oben nach dem sleep(1) stehen wuerde) obige for schleife erniedrigt den wert von $alter mit dem $alter-- ausdurck. der macht wie man es nicht anders erwartet das selbe wie: $alter=$alter-1; zum schluss noch eine andere art schleifen zu schreiben: #!/usr/bin/perl -w $bla=0; do { print "bla ist " , $bla , "\n" ; $bla++; } until ($bla > 10); die do { } until () schleife wird mindestens einmal ausgefuehrt und nach jeder ausfuerhung wird geprueft ob die until bedingugn erfuellt ist. falls die erfuellt ist wird die schleife nicht mehr ausgefuehrt. EXERCISES: * schreibe ein kurzes perl script das eine tabelle mit 13 zeilen mit den faktoriellen von 1 bis 13 ausgibt.. (die faktorielle von 5 ist z.b: 1*2*3*4*5 = 120) * schreibe ein kurzes perl script dass zeilen von stdin liest und das am ende jeder zeile ein rufzeichen anfuegt. REFERENCES: man perlsyn