
perl
Wir sezten unsere Kurzeinführung in perl mit einer einfachen Schleife 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" ;
$zähler = $zähler + 1 ;
sleep(1);
}
Wenn wir obiges Programm ausführen (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 erfüllt ist. Anstatt: $zaehler=$zaehler+1 könnten wir auch
$zaehler++;
schreiben. Das ist eine abgekürzte Schreibweise für $zähler=$zähler+1
ist praktisch weil man oft Variablen um 1 erhöhen muss. (C Programmierer
kennen das schon)
Das sleep(1); schläft eine Sekunde. ich hab das eingebaut damit das
ganze nicht so schnell durchlaüft.
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. Aer 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 allfälliges Zeilende Zeichen von $_. Bei der Ausgabe wir
das ohnehin wieder mit dem " \n" hinten angefügt.
Wollen wir jetzt z.B. ein Programm schreiben dass alle Zeilen mit einer
Zeilennummern voran ausgibt so würde das so aussehn:
#/usr/bin/perl -w
$znr=1;
while( ) {
chomp ;
print "$znr: $_ " ;
$znr++;
}
Zu beachten: Wir verwenden hier wieder die Möglichkeit von Perl dass
Variablen in einen string hineinsubstituiert werden. In weniger
fortgeschrittenen Programmiersparchen müssten 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 fügt 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 (vor allem 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 ausgeführt.
* der mittlere Teil ist wie in der while Schleife die Bedingung die
abgeprüft wird und die erfüllt sein muss damit die Schleife weiter
ausgeführt wird.
* der letzte Teil wird nach jedem Schleifendurchlauf ausgeführt (ist
also wie wenn er oben nach dem sleep(1) stehen würde)
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 ausgeführt und nach
jeder Ausfürhung wird geprüft ob die until Bedingugn erfüllt ist. Falls
die erfüllt ist wird die Schleife nicht mehr ausgeführt.
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 das Zeilen von stdin liest und das
am Ende jeder Zeile ein Rufzeichen anfügt.
|