Matti Maekitalo: Funktion ausfuehren, deren Namen nur als Skalar bekannt

Beitrag lesen

use Mosche;

eval $scalar; funktioniert bei mir..

ist abe rnicht nötig.

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

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.

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...

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.

use kannst du nicht verwenden (außer in BEGIN), und ein "berechnetes" use macht in den wenigsten Fällen Sinn. Was bei deiner Version relativ schwer fällt:

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).

Wenn du diese Beschränkungen dezentral durchführst, dann musst du einen ganzen Haufen von Logik darein investieren, nur weil unterschiedliche Masken sich nicht unbedingt gegenseitig _kennen_. Vielleicht ist nicht alles gleich verständlich, frag dann einfach mal nach. Vielleicht habe ich deinen Ansatz aber auch falsch verstanden.

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

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.

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

use Tschoe qw(Matti);

--
  Anyone who quotes me in their sig is an idiot. -- Rusty Russell.