
Übergabe von Parametern
globale Variablen
lokale Variablen
Was in anderen Programmiersprachen Funktionen
sind, wird in Perl Subroutine genannt. Auch die Übergabe
von Parametern unterscheidet sich von der Übergabe in
anderen Programmiersprachen. Mit Subroutinen können die
Teile des Codes, die identisch mehrere Male auftauchen, zusammengefasst
werden. In der Praxis ist das allerdings nicht so einfach,
da der Code meistens nicht 100 % identisch ist und über
Parameter eine Feinsteuerung vorgenommen werden muss.
Machen wir uns das an einem Beispiel klar:
print "Hallo Andres \n";
print "Hallo Maria \n";
print "Hallo Schokufeh \n";
Dieses Skript
können wir jetzt mit einer Subroutine verkürzen:
hallo("Andres");
hallo("Maria");
hallo("Schokufeh");
sub hallo
{
print "Hallo $_[0] \n";
}
Überraschend
ist hier, wie die Parameter übergeben werden.
Alle Parameter werden in dem speziellen Array @_ gespeichert,
wobei ein Element dieses Arrays also $_[0] nicht mit der Sondervariablen
$_ verwechselt werden sollte.
Nach diesem Schema können beliebig viele Parameter übergeben
werden:
hallo("Herr","Andres");
hallo("Frau","Maria");
hallo("Frau","Schokufeh");
sub hallo
{
print "Hallo $_[0] $_[1] \n";
}
Der
Aufruf einer Subroutine kann auch in einer etwas anderen Syntax
erfolgen:
&hallo("Herr","Andres");
&hallo("Frau","Maria");
&hallo("Frau","Schokufeh");
sub hallo
{
print "Hallo $_[0] $_[1] \n";
}
Manchmal
gibt es Probleme, wenn die Definition der Subroutine vor dem
Aufruf der Subroutine erfolgt. Das kann gelöst werden,
wenn das & Zeichen davor gesetzt wird.
Ab Perl 5 ist das nicht mehr nötig.
Unter globalen Variablen versteht man Variablen,
die überall, auch in der Subroutine, sichtbar sind, und
die überall verändert werden, wenn sie in der Subroutine
verändert wurden.:
$kirsche="Andres Ehmann";
print "$kirsche ist ein netter Kerl \n";
sub sympathie_geaendert
{
$kirsche="Theodor Wiesengrund Adorno";
}
sympathie_geaendert;
print "$kirsche ist ein netter Kerl \n";
Die Variable
$kirsche wurde innerhalb der Subroutine geändert. Da
die Variable $kirsche global gültig ist, wird sie überall
geändert, auch außerhalb der Subroutine.
$kirsche="Andres Ehmann";
print "$kirsche ist ein netter Kerl \n";
sub sympathie_geaendert
{
my $kirsche="Theodor Wiesengrund Adorno";
}
sympathie_geaendert;
print "$kirsche ist ein netter Kerl \n";
Steht
ein my vor der Variablen $kirsche, dann ist die Änderung
nur in der Subroutine gültig. Außerhalb der Subroutine
behält der ursprüngliche Wert seine Gültigkeit.
Wenn Subroutinen rekursiv aufgerufen werden (wenn eine Subroutine
sich selbst immer wieder aufruft), ist es unter Umständen
von entscheidender Bedeutung, dass die Variablen nur lokal
für die Subroutine gültig sind. Ein Beispiel hierzu
siehe: Suchmaschine. Für
Leute, die aus anderen Programmiersprachen kommen, ist die
Tatsache seltsam, dass Perl kein Return braucht, um etwas
zurückzugeben.
Perl gibt einfach die letzte Anweisung aus:
sub rechner
{
$zahl1=$_[0] * 10;
$zahl2=$_[1] * 10;
$summe=$zahl1 * $zahl2;
}
print rechner(10,5);
|
 |