Login
Newsletter
Werbung

Mo, 16. August 1999, 00:00

Perl/CGI-Workshop, Teil 12

Perl/CGI-Workshop, Teil 12.

Unterprogramme

Selbst in BASIC gibt es inzwischen sowas wie Unterprogramme, also darf das auch in Perl nicht fehlen. Unterprogramme heißen in Perl aber nicht "Funktionen" (wie beispielsweise in C), sondern einfach "Subs". Prinzipiell funktioniert das in Perl so:

#!/usr/bin/perl
# sub1.pl -- by W. Jährling
while (1) { &frage; }
sub frage {
 my $antwort # lokale Variable
 print STDERR "Wollen Sie weitermachen? ";
 $antwort = <STDIN>;
 chomp $antwort;
 die "Programm beendet!\n" if $antwort eq "y" || $antwort eq "Y";
}

Das &-Zeichen vor dem Funktionsaufruf darf seit Perl 5 entfallen (das bedeutet für Sie: weniger Schreibarbeit :-) ).

Es mag verwundern, dass die Variable $antwort extra deklariert wird, doch wenn man dies nicht tun würde, würde eine globale Variable namens $antwort erzeugt, was wir eigentlich ja nicht wollen.

Einer Sub können Sie in Perl übergeben, was Sie wollen, es wird alles im Array @_ gespeichert. Wenn Sie auf Elemente dieses Arrays zugreifen, werden auch die orginalen Werte der Variablen geändert, die Übergabe erfolgt also "by reference":

#!/usr/bin/perl
# sub2.pl -- by W. Jährling
# *** Parameter benutzen: ***
sub schreibe {
 print @_;
}
schreibe("Hallo", ' ', "Welt!\n");
schreibe "Test123!\n";
# *** Parameter verändern: ***
sub sortiere {
 @_ = sort @_;
}
($a, $b, $c) = ("z", "y", "x");
sort $a, $b, $c;
schreibe $a, $b, $c; # Ergibt: "xyz"
# *** Übergabe "by value": ***
sub foo {
 my @parameters = @_;
 # Tolle Dinge mit @parameters machen
 # ...
}
# *** Nochmal Übergabe "by value": ***
sub bar {
 my ($a, %b, $c) = @_;
 # Tolle Dinge mit $a, $b und $c machen
 # ...
}
# ...

Natürlich kann eine Sub auch ein Resultat zurückliefern. Das kann, wie in C/C++ üblich, mit "return" geschehen, oder implizit durch den letzten Befehl (sofern es ein Ausdruck ist) einer Sub:

#!/usr/bin/perl
# sub3.pl -- by W. Jährling
sub max {
 return ($_[0] > $_[1]) ? $_[0] : $_[1];
}
$a = max($uhrzeit, 8);
# Oder alternativ:
sub auch_max {
 ($_[0] > $_[1]) ? $_[0] : $_[1];
}
# ...

Wenn Sie den ?:-Operator noch nicht kennen: Das Resultat von "a ? b : c" ist b, wenn a wahr ist und c, wenn a falsch ist. Damit sollte das obige Beispiel klar sein.

Es gibt aber auch Subs, die Arrays zurückliefern, z.B. die in Perl eingebaute sort()-Subroutine. Das geht in Perl analog zum Rückgeben von Skalaren (z.B. "return @result;"), aber das wollen wir jetzt gar nicht näher betrachten. Stattdessen wollen wir uns die Möglichkeit ansehen, je nach Aufrufkontext entweder ein Array oder einen Skalar zu liefern. Dies geht mittels "wantarray", welches wahr ist, wenn eine Sub ein Array liefern soll:

#!/usr/bin/perl
# sub4.pl -- by W. Jährling
sub datei {
 open(DATEI, "< $_[0]") or die "Kann Datei nicht öffnen!\n";
 @lines = <DATEI>;
 return wantarray ? @lines : "@lines";
}
# ganze Datei in ein Array einlesen...
@etc_passwd = datei("/etc/passwd");
# ...oder alles in einen Skalar:
$etc_messages = datei("/etc/messages");

So, das soll uns erstmal reichen! :-)

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung