Werbung einblenden Werbung ausblenden


Home / Tutorials / Perl Handbuch / Subroutinen

Übergabe von Parametern
globale Variablen
lokale Variablen

Übergabe von Parametern

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.

globale Variablen

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.

lokale Variablen
$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);
vorhergehendes Kapitel