ABSTRACT: perl: sub routinen werden erklaert und perlmodule kurz angerissen lokale variablen (my) werden erklaert. "use strict;" wird empfohlen. AUDIENCE: perl beginners SYSTEM: any unix SECTION: perl AUTHOR: mond COPYRIGHT: GNU Free Documentation Licence http://www.gnu.org/licenses/fdl.txt um komplexere programme in perl schreiben zu koennen benoegit man die moeglichkeit oft benoetigte teile in unterprogramme zu kapseln. das geht in perl mit dem wort "sub". sub durchschnitt { my $a=shift; my $b=shift; my $ergebniss=($a + $b)/2; return $egbeniss; } obiges stueck perlcode defniert eine funktion die durschnitt heisst und den mittelwert 2er zahlen berechnet. das ergebniss der funktion wird mit dem befehl "return" zurueckgeliefert. man kann die sub funktion, nachdem man sie definiert hat, zb. so benuezten: print durchschnitt(5,7),"\n"; die parameter an eine funktion (hier z.b. die zahlen 5 und 7 ) stehen in der sub funktion als array mit dem namen @_ zur verfuegung. die funktion shift liest nacheinander von diesem array wenn man ihr kein anderes angibt. wir haetten auch schreiben koennen: my $a=@_[0]; das wort "my" bedeutet dass die variable nur lokal innerhalb des paares an geschwungenen klammern gueltig ist in dem es definiert ist. gibt es irgendwo anders im programm ebenfalls eine variable mit dem namen $a so wird diese damit NICHT ueberschrieben. man kann das auch an anderer stelle tun und nicht nur im sub. (man muesste es auch im sub nicht.. es ist aber sehr zu empfehlen) bei groesseren scripts koennen solche fehler wo man variablen mit verschiedenen namen ueberschreibt schwer zu finden sein. es ist daher guter programmier stil generell alle variablen mit "my" zu definieren. im gegensatz zu den mit my defnierten lokalen variablen nennt man die variablen die ueberall sichtbar sind "global". schreibt man zu beginn seines programmes: #!/usr/bin/perl -w use strict; dann verlangt perl dass jede variable bevor sie benuetzt ist mit my definiert wurde. variablen die am anfang des perl programmes ausserhalb jeder sub funktion definiert wurden sind natuerlich weiterhin ueberall zugreifbar. groesser projekte sollte man immer mit "strict" machen. zurueck zu den sub funktionen. wir koennten also jetzt unser durchschnitt programm schoener machen in dem wir nacheinander von @_ lesen: sub durchschnitt { my $cnt=0; my $sum=0; foreach my $k (@_) { $sum += $k; $cnt++; } if ($cnt > 0 ) { return $sum/$cnt; } else { return 0; } } diese version akzeptiert beliebig viele argumente und rechnet immer den mittelwert aus: print durchschnitt(5,7,8,6),"\n"; man beachte dass das my fast an jeder stelle zulaessig ist. also oben auch direkt nach dem foreach. die schleifenvariable $k ist damit (so wie es sein soll) nur in der foreach schleife ueberhaupt definiert. will man mehr als einen wert zurueck geben so kann man das ueber den umweg eines arrays machen. z.b.: #!/usr/bin/perl -w use strict; sub blabla { return (1,2,"drei"); } (my $a,my $b, my $c)=blabla(); print "a=$a\nb=$b\nc=$c\n"; in noch groesseren projekten ist vorteilhaft programme auf mehrere files aufzuteilen. man programmiert einzelne "module" die jeweils fuersich eine funktion erfuellen und stelle diese dann zu groeseren programmen zusammen. diese module nennt man .pm (fuer perl modul) und man kann sie mit dem befehl "use" inkludieren. wie man eigene .pm module schreibt lernen wir ein ander mal. fuer heute benutzen wir mal eines der vielen vorhandenen module: use POSIX; print 2*acos(0),"\n" im POSIX modul ist z.b. die acos (arcus cosinus) funktion definiert. moderne distributionen enthalten schon relativ viele module bzw man kann sie mit dem packetsystem nachinstallieren. weitere module fuer verschiedenste funktionen finde man im CPAN archiv: http://www.cpan.org/ in oesterreich http://gd.tuwien.ac.at/languages/perl/CPAN/ das installieren ist relativ leicht. meist das .tgz auspacken dann: perl Makfile.PL make make install dokumentation zu perlmodulen kann man mit dem shell befehl "perldoc" abrufen. z.b: perldoc POSIX eines der beliebtesten module ist CGI.pm zum schreiben von CGI scripts in perl. dazu bald mehr. EXERCISES: * schreibe eine sub funktion die als parameter einen textstring akzeptiert und diesen zurueckliefert wobei alle umlaute im string durch ae oe ue etc ersetzt werden. teste die funktion in dem du sie in einer schleife aufrufst die daten von STDIN uebersetzt. (hinweise: du kannst entweder direkt die umlaute in dein perl programm tippen und perl akzeptiert sie als zeichen oder man verwendet die form: "ein umlaut a ist: \344" wobei die zahl im octal format anzugeben ist. eine liste der umlaute im latin1 zeichensatz findest man mit man latin1 * schreibe eine sub funktion die das /etc/passwd file liest und alle usernamen in das globale array @usernamen schreibt. rufe die funktion dann auf und gib die namen dieses arrays danach aus. verwende "use strict" fuer dein script. REFERENCES: man perlsyn man perlfunc man perlmod perldoc POSIX