Blog

Änderungen bei Subroutinen-Signaturen

07.07.2023 // Renée Bäcker

Mit Version 5.36 haben die Subroutinen-Signaturen ihren Status als Experiment verloren und gelten als stabil. Mit 5.38 kommt eine kleine Änderung. Ein Beispiel für Subroutinen-Signaturen:

use v5.38;

test();
test( 'GPW' );
test( undef );

sub test ( $name = 'World' ) {
    say "Hello $name!";
}

In diesem Fall gibt es in der Signatur einen optionalen Parameter und wenn dieser leer ist, wird er mit dem Wert World gefüllt.

Führt man dieses kleine Skript aus, bekommt man diese Ausgabe:

Hello World!
Hello GPW!
Use of uninitialized value $name in concatenation (.) or string at signatures.pl line 11.
Hello !

Es macht also einen Unterschied, ob man keinen Parameter übergibt oder ein undef. In vielen Fällen stehen die Werte für die Parameter aber nicht fest in der Anwendung sondern kommen z.B. aus einer Datenbank.

use v5.38;

my $name = _get_name_from_db();
test( $name );

sub test ( $name = 'World' ) {
    say "Hello $name!";
}

Was passiert jetzt wenn in der Datenbank kein Name steht. Was möchte man jetzt sehen? Die Warnung und ein einfaches Hello ! oder nicht doch ein Hello World!? Vermutlich letzteres. Bisher hätte man jetzt zwei Funktionsaufrufe implementieren müssen – einmal wenn $name einen Wert hat und einmal wenn kein Wert in der Variablen steht.

Mit den kleinen Änderungen an den Subroutinen-Signaturen ist das jetzt aber nicht mehr notwendig. Bei Defaultwerten können jetzt //= und ||= genutzt werden, also z.B.

use v5.38;

my $name = _get_name_from_db();
test( $name );

sub test ( $name //= 'World' ) {
    say "Hello $name!";
}

Damit würde auch dann Hello World! erscheinen wenn kein Name in der Datenbank gespeichert ist.


Permalink: