anaboe.net

Aufrufen einer Subroutine, deren Name nur als String bekannt ist

Zielstellung

In einem Skript sollen an verschiedene Strings die Namen von Subroutinen gebunden werden. In Abhängigkeit von diesem String soll die dazu gehörende Subroutine ausgeführt werden.

Perl - Code

#!usr/bin/perl -w
use strict;
use warnings;
use CGI qw/param/;

my $ret;

# Beispiel 1: Funktionsreferenzen
my %commands1 = ( "BEFEHL1" => \&sub_1,
                  "BEFEHL2" => \&sub_2,
                  "BEFEHL3" => \&sub_3
                );

# Beispiel 2: anonyme Funktionen
my %commands2 = ( "BEFEHL1" => sub { print "Befehl 1"; },
                  "BEFEHL2" => sub { print "Befehl 2"; },
                  "BEFEHL3" => sub { print "Befehl 3"; }
                );

my $command = param('befehl');
my $arg = param('arg');

if(exists $commands{$command}) {
  $ret = $command{$command}->($arg);
}
else {
  print "$command ist kein gueltiger Befehl";
}

sub sub_1 { return 1; }
sub sub_2 { return 2; }
sub sub_3 { return 3; }

Erläuterungen

Das 1. Beispiel definiert einen Hash, dessen Schlüssel die als String vorliegenden Kommandos sind, denen eine Referenz auf die dazu gehörende Subroutine zugewiesen wird. Sinnvoll ist diese Vorgehensweise, wenn es sich um umfangreiche Subroutinen handelt, denen Parameter übergeben werden sollen. Das zweite Beispiel definiert für die Elemente des Hashes anonyme (namenlose) Subroutinen, was dann sinnvoll sein kann, wenn es sich um relativ wenige Anweisungen handelt und keine Parameter erforderlich sind.