2026-09-18

Perl: Funktion als Unterbefehl angeben

Der Titel ist etwas verwirrend, ja. Aber ich versuche den Sachverhalt zu umschreiben:

Angenommen, wir haben ein Perl-Script, das Unterbefehle erwartet, z.B. wie Git (git pull) oder Go (go build). Diese könnte man so implementieren:

my $cmd = shift @ARGV;
if    ( $cmd eq 'a' ) { print a(@ARGV) }
elsif ( $cmd eq 'b' ) { print b(@ARGV) }
else  { die "$cmd: invalid command\n" }

sub a { "Gruss von a" }
sub b { "Gruss von b" }

Der Nachteil ist, dass man bei jedem neuen oder veralteten Befehl 2 Stellen anpassen muss.

Aber wie so oft in Perl, gibt es einen besseren Weg. Statt den Unterbefehl mit einer Zeichenkette zu vergleichen, gucken wir einfach, ob das Skript die entsprechende Funktion enthält und rufen diese dann auf:

my $cmd = shift @ARGV;
my $sub = main->can($cmd) or die "$cmd: unvalid command\n";
print $sub->(@ARGV);

Dadurch lässt sich jede Funktion, z.B. auch bei einer Fehlersuche, als Unterbefehl aufrufen.

(Wie man den Aufruf bestimmter Funktionen unterbinden kann, ist dem Leser als Übung überlassen ;-)