IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Perl - Perl-Subroutinen



Perl-Subroutinen

Sub-routinen und Lokale variablen (my) werden erklärt sowie Perlmodule kurz angerissen. "use strict;" wird empfohlen.


Autor: Franz Schaefer (mond)
Datum: 01-03-2002, 20:42:05
Referenzen: man perlsyn
man perlfunc
man perlmod
perldoc POSIX
Schwierigkeit: Anfänger
Ansichten: 4349x
Rating: Bisher keine Bewertung.

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Übersicht

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.

_______________________________________________
CD ist ein service von SILVER SERVER
der inhalt unterliegt der GFDL
_______________________________________________



[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04508
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06244
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1146
Comments: 0