Ein Kollege fragte mich heute, wie man in Perl nochmal Parameter an eine Funktion übergibt.
Das ist ja im Prinzip ganz einfach. Eine Funktion in Perl erhält als Übergabeparameter eine einfache Liste mit Namen @_. Aber damit fängt es dann erst an.
Nehmen wir mal an, wir haben eine einfache Funktion mit zwei Parametern:
sub twoParamFunction { my ($one, $two) = @_; print "$one and $twon"; }
Hier wird die Liste @_ einer Liste mit gerade frisch deklarierten Variablen zugewiesen. Es werden also alle zusätzlichen Parameter verworfen. Diese Art der Parameterübergabe ist vermutlich eine der gebräuchlichsten und einfachsten.
Aber natürlich war das nicht die Art der Übergabe, die mein Kollege im Sinn hatte. Also gut, wir können auch benannte Parameter mit Standard-Werten benutzen:
sub hashAsParam { my %hash_param = ( 'one' => 'Eins', 'two' => 'Zwei', @_ ); print "$hash_param{one} und $hash_param{two}n"; }
Hier wird die Liste in eine Hashstruktur eingeblendet und so können die benannte Parameter one und two sowohl übergeben, als auch weggelassen werden – dann erhalten sie eben ihre Standardwerte.
Aber ach, das war es auch nicht. Nun gut, wir können beide Methoden mischen:
sub mixedParams { my ($one, $two, %optional) = @_; print "$one and $twon"; print join("; ", keys %optional) . "n"; }
Hier werden aus der Parameterlliste die ersten beiden Elemente $one und $two zugewiesen, und der Rest wird wie in hashAsParam einer Hashstruktur aufgehen. Wenn hierbei auch noch Standardwerte vorgegeben werden sollen, kann das in einer extra Zeile geschehen.
Hmhm, das war es auch nicht. Ok, wir können natürlich auch noch die Liste einzeln abarbeiten:
sub oneStep { my $one = shift; my $two = shift; print "$one and $twon"; }
Ja, genau das wars! Aber wo wir jetzt schon so viele Varianten hatten, können wir eine noch zusätzlich anbieten:
sub selectAFew { my ($one, $four) = @_[0,3]; print "$one a $fourn"; }
Äh? Aber ab hier sollte eigentlich spätestens klar sein, dass man perldata und man perlsyn mal wieder besucht werden sollten. Um den ganzen die Krone aufzusetzen, kam mein Kollege eine halbe Stunde später wieder an. Diesmal wollte er aber die Möglichkeiten der Rückgaben aus Perl-Funktionen wissen…