Chris Weber: Variable als Name fuer Subroutine ?

Hallo mal wieder,

Ich schreibe gerade ein CGI Script an das ich ueber einen Link auf einer HTML-Seite Parameter uebergebe.  Diese Parameter werden ja in der Variablen $ENV{'QUERY_STRING'} gespeichert, nicht wahr?  Wie kann ich es nun anstellen, daß je nach dem uebergebenen Parameter eine Spezielle Subroutine aufgerufen wird ?
Mit:

$test = $ENV{'QUERY_STRING'};

$test();

sub $test {
    # blah blah
}

habe ich es schon versucht, aber es klappt nicht es sei denn ich aendere den Namen der Subroutine in etwas anderes (keine Variable).  Koennt Ihr mir helfen ?

Danke

Chris

  1. Hallo Chris!

    Ohne "Hardcore"-Perl wuerde ich vorschlagen, als Parameter eine Kennung zu uebergeben und dann mit if, elsif bzw. mit SWITCH: Block arbeiten. Siehe http://www.perl.com/pub/doc/manual/html/pod/perlsyn.html#Basic_BLOCKs_and_Switch_Statemen

    Gruß
    Thomas

  2. Hallo Chris!

    Ausser der von Thomas vorgestellten Variante (welche sicherlich die lesbarste ist, wenn man einen ordentlichen Switch-Block verwendet), sind noch diese beiden Wege machbar.

    1. Du baust Dir einen Hash mit Referenzen auf Deine einzelnen Funktionen und benutzt dann den uebergebenen Querystring als Zugriffskey in den Hash:

    # die Funktionen, die die Arbeit machen
        sub do_action1 {
            # laber laber
        }
        sub do_action2 {
            # laber laber
        }
        sub do_action3 {
            # laber laber
        }

    # Referenzen auf die Fkt. im Hash ablegen
        %dispatch = (
            'action1' => &do_action1,
            'action2' => &do_action2,
            'action3' => &do_action3
        );

    # Fragen, welche action getan werden soll
        $command = lc($ENV{'QUERY_STRING'});    # lc(), damit Gross/klein egal ist

    # Pruefen, ob Kommando ok
        if (!defined($dispatch{$command})) {
            die("Unbekannte action!");
        }
        
        # und los geht's
        &{$dispatch{$command}};

    Mit $dispatch{$command} holst Du Dir dabei die jeweilige Referenz aus dem Hash und mit &{$ref} fuehrst Du die dann aus.

    2. Benutze eval();

    $command = lc($ENV{'QUERY_STRING'});
        eval($command);
        
    Mit eval() reisst Du jedoch ein riesiges Sicherheitsloch auf, denn so kann man mit dem Aufruf
        /cgi-bin/script.pl?format /u c:
    ganz einfach mal das Script veranlassen, beliebige lustige Dinge zu veranstalten.

    Calocybe