Christian Kruse: Funktion ausfuehren, deren Namen nur als Skalar bekannt

Beitrag lesen

Hallo Lude,

ich moechte in Abhaengigkeit des Wertes eines Skalars eine Funktion
ausfuehren lassen. Primitive Ansaetze, wie

&($in{WhatToDo});
&$in{WhatToDo};

funzten net.

'funzen' gibts nicht.

Wie geht es richtig? (Hoffentlich geht's mit dem griffigen Perl, in
anderen Sprachen geht's ja oft nicht.)

Am einfachsten und saubersten ist das ueber ein Modul per Autoload
zu implementieren:

Actions.pm:

package Actions;

our $AUTOLOAD;

sub aktion1 {
  my $self = shift;
  ...
}

sub aktion2 {
  my $self = shift;
  ...
}

sub AUTOLOAD {
  my $self = shift;
  my $subname = lc $AUTOLOAD;

$subname =~ s/.*:://;

if($subname ne 'destroy' && $subname ne 'end') {
    if(my $ref = $self->can($subname)) {
      &$ref($self,@_);
    }
    else {
      # Fehler, undefinierte Aktion
    }
  }
}

1;

Script:

use Actions;

my $subname = $hash->{WhatToDo};
my $acts = new Actions;

$acts->$subname();

AUTOLOAD wird hier also nur dazu benutzt, um zu prüfen, ob eine
Methode vielleicht in falscher Gross- oder Kleinschreibweise
übergeben wurde und um ein eigenes Fehlerhandling zu ermöglichen.
Die Methode ist sauber und strict-kompatibel. Mehr dazu gibts unter

perldoc perlsub
perldoc perlmod
perldoc perltoot
perldoc UNIVERSAL

Grüße,
 CK

--
Mit einem Windhauch kannst du das Feuer loeschen. Mit einem Windhauch kannst du das Feuer entfachen.