Struppi: Funktion ausfuehren, deren Namen nur als Skalar bekannt

Beitrag lesen

eval $scalar; funktioniert bei mir..

ist abe rnicht nötig.

Wie gesagt, dass halte ich auch nicht für sehr sauber...

stimmt hatte ich überlesen ;-)

Das ist aber umständlicher als die Funktion ganz normal zu definieren und der Kontrollstruktur nur die Namen der Funktionen mitzugeben.

Das verstehe ich nicht ganz. Könntest du das bitte nochmal erläutern. Schaue dir mal bitte den Quelltextwust in [pref:t=70607&m=406316] an.

Naja, er müßte in halt immer schreiben:

$hash->{funktiosname} = sub () { .... };

und könnte diese dann auch nicht mehr in verschiedenen Dateien unterbringen.

in Bezug auf das Orginal:

if ($in{WhatToDo} eq 'BenutzerQuery') {&BenutzerQuery;}
...
usw.
...
if ($in{WhatToDo} eq 'Update') {&Update;}

wird zu:

if(defined &{$in{WhatToDo}) &{$in{WhatToDo}()

Deine Lösung (aus [pref:t=70607&m=406329]) hat den Makel, dass du explizit 'refs' auf no-Strict-Modus schaltest. Solche Warnungen haben meistens ihre Gründe...

sicher, aber wenn man weiss warum die Warnung kommt und das man das wirklich will ist no strict das Mittel der Wahl und mit Sicherheit eben deshalb auch vorgesehen.

Ich benutze z.b. sowas: [...]

Naja, du benutzt im Grunde nichts anderes. Im Abhängigkeit eines Strings wird eine passende Datei geladen. Ich persönlich (IMHO) benutze kein require, da dann zur Laufzeit irgendwas nachgeladen werden muss, und ich will möglichst vermeiden, irgendwelche Probleme zur Laufzeit zu bekommen.

Was sollen denn da für Probleme auftauchen?
Letztlich schmeisst Perl ganz normal die Fehler oder überseh ich da was?
Für mich sah es so aus als ob ich mit meiner Methode leichter eine komplexe CGI Anwendung erweitern kann.

Stell dir vor, jede einzelne Funktion du redest wahrscheinlich über Programme im CGI-Kontext, also nenne ich das ganze ab hier Maske) hängt von anderen ab. Solange du nicht entsprechende Zugriffsbeschränkungen zentral ablegst (was deine dezentralen Module (=Masken) ad absurdum führt), musst du diese Zugriffsbeschränkungen dezentral durchführen. (Zugriffsbeschränkungen kann zB auch sein, dass verlangt wird, eine zweite Maske vor einer dritten aufzurufen. Parameter können ja auch gefälscht sein).

So ganz kapieren tu ich das nicht wo du das Problem siehst.
Ja ich red von CGI Programmen. In meiner Kontrollstruktur sind auch die Zugriffsbeschränkungen eingebaut.

Also in etwa so:

my @action = (
{
name => 'bla',
func => 'func',
modul => 'datei',
user => 1
},
{
name => 'bla',
func => 'func',
modul => 'datei',
user => 0
}
);

(Daneben gibt es noch 'menu' um die funktion im Menü anzuzeigen, 'text' als Erläuterungstext)

Was passiert also: um das ganze zu dezentralisieren, benötigst du einen ganzen Haufen von Logik, die du dann doch irgendwie zentral halten musst.

So sieht's aus, aber ein Haufen finde ich das nicht. Es ist letztlich eine Funktion mit wenig Zeilen die in dem Modul main (per use eingebunden) zu finden ist:

sub getAction
{
my $action = shift || return '';
my $modul = shift;

return 'keine Action' unless $action;

if(defined $action->{func})
{
my $func = $action->{f};
no strict 'refs';
if( defined &{$func} )
{
return CGI::h1("Zugriff nicht erlaubt!! ($func)")
if !$user->checkFunc($func);

return &{$func}();
}
else
{
return "Funktion: $func () existiert nicht in $modul.". start($modul);
}
}
return start($modul); # ist in jeder pl Datei vorhanden
}

Ich seh grad, ich habe mittlerweile das mit dem require geändert, da ich den Schlüssel 'modul' in's Menü einbaue, da steht dann in etwa sowas:

<a href="$action->{modul}.pl">$action->{text}</A>

Das wird dann auch dynamisch aufgebaut je nach Zugriffsrechte.

Außerdem (auch wenn man solche Fehler abfangen kann, wie du es tust), ist der Zugriff auf das Dateisystem durch Parameter prinzipiell eine Sicherheitslücke. Ohne gut zu wissen, was man tut und was passieren kann, würde ich niemandem eine solche Methode empfehlen.

Naja, die Parameter sind ja nicht direkt dynamisch, ich benutze in diesem Fall nur Parameter die von mir definiert sind.

Ich habe seit einiger Zeit ein relativ langes Script (~40 Kb) mit meiner Methode am laufen.

ich kann dir nicht wirklich sagen wieviel KB in Gebrauch sind aber ich hab 45 pm/pl Dateien mit ca. 350KB. Durch die Module finde ich halbwegs schnell die Funktionen falls mal was geändert werden muss und kann relativ schnell zusätzliche Funktionen einbauen, auch wenn sie komplexer sind.

Falls es dich interessiert das ganze Ding läuft hier http://die-bunte-liga.de/cgi-bin/action.pl und bietet für die Mitglieder noch ein Haufen mehr Funktionen, je nach Zugriffsberechtigung.

Wenn du irgendwelche schlimmen Lücken siehst, würd ich mich über Tipps freuen.

Struppi.