myMojito: Variable mittels 'require' übergeben

Hallo SelfForum,

ich kämpfe gerade damit, mein Perl-Skript "modularer" zu gestalten.
Ich möchte auf jeder HTML-Seite, die durch das CGI-Skript (es sind meherer Skripte) dargestellt werden, ein paar Daten anzeigen.

Um nicht in jedem Skript den gleichen Code-Schnippsel einfügen zu müssen, habe ich die Funktionen in ein weiteres Skript ausgelagert. Dieses Skript rufe ich in den anderen Skripten an der geeigneten Stelle mit:
my $online_monitor = require "includes/online_monitor.pl";
auf.

Das aufgerufene Skript gibt eine Referenz auf ein Hash zurück, was auch alles wunderbar funktioniert. Jetzt möchte ich aber dem Skript "online_monitor.pl" noch einen Wert übergeben.... daran bin ich aber bisher gescheitert. Auch mein Versuch in dem Skript "online_monitor.pl" mittels caller() auf Variablen des aufrufenden Skriptes zuzugreufen schlug fehl.

Kann mir jemand einen Tipp geben? Bei "use" meckert der Compiler mir an, das "use" nicht rechts neben einem "=" stehen darf. Ein Modul, das ich einbinde und aufrufe, möchte ich auch vermeiden, da ich am liebsten eine einzige Zeile stehen hätte, in der ich ersehen kann das eine Variable mit Werten aus einem anderen Skript gefüllt wird.

Gruß
Helmut Weber

--
-------------------------------------------
Mode ist eine Variable, Stil eine Konstante
  1. Halihallo myMojito

    Um nicht in jedem Skript den gleichen Code-Schnippsel einfügen zu müssen, habe ich die Funktionen in ein weiteres Skript ausgelagert. Dieses Skript rufe ich in den anderen Skripten an der geeigneten Stelle mit:
    my $online_monitor = require "includes/online_monitor.pl";
    auf.

    IMHO falscher Ansatz. Ausgelagerte Funktionen gehören in Module, denn diese sind
    dafür gedacht:

    perldoc perlmod
    perldoc perlmodstyle

    Das aufgerufene Skript gibt eine Referenz auf ein Hash zurück, was auch alles wunderbar funktioniert. Jetzt möchte ich aber dem Skript "online_monitor.pl" noch einen Wert übergeben.... daran bin ich aber bisher gescheitert. Auch mein Versuch in dem Skript "online_monitor.pl" mittels caller() auf Variablen des aufrufenden Skriptes zuzugreufen schlug fehl.

    Ein Script gibt keine Werte zurück (höchstens ein Exit-Code); wenn du es dennoch
    ermöglicht hast, ist es höchstens ein Workaround; zudem wird dies bei use strict;
    noch ärger, denn dann kriegt das required Script einen eigenen Namensraum und die
    Variablen werden nicht mehr "an gemeinsamer Stelle" verwaltet...

    Du möchtest _Prozeduren_ und _Funktionen_ verwenden, keine externen Scripte.

    Kann mir jemand einen Tipp geben? Bei "use" meckert der Compiler mir an, das "use" nicht rechts neben einem "=" stehen darf. Ein Modul, das ich einbinde und aufrufe, möchte ich auch vermeiden, da ich am liebsten eine einzige Zeile stehen hätte, in der ich ersehen kann das eine Variable mit Werten aus einem anderen Skript gefüllt wird.

    Nun, ich würde deinen bisherigen Weg verlassen und mich mit Modulen beschäftigen.

    Viele Grüsse

    Philipp

    --
    RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
    Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
  2. Halihallo Helmut

    Um nicht in jedem Skript den gleichen Code-Schnippsel einfügen zu müssen, habe ich die Funktionen in ein weiteres Skript ausgelagert. Dieses Skript rufe ich in den anderen Skripten an der geeigneten Stelle mit:
    my $online_monitor = require "includes/online_monitor.pl";
    auf.

    und in online_monitor.pl hast du ein 'return ...' stehen?

    Das aufgerufene Skript gibt eine Referenz auf ein Hash zurück, was auch alles wunderbar funktioniert. Jetzt möchte ich aber dem Skript "online_monitor.pl" noch einen Wert übergeben.... daran bin ich aber bisher gescheitert. Auch mein Versuch in dem Skript "online_monitor.pl" mittels caller() auf Variablen des aufrufenden Skriptes zuzugreufen schlug fehl.

    verwendest du 'use strict'? - Wenn nicht, sind alle Variablen im main-Scope und lassen
    sich auch im includierten Script auslesen. Das ist AFAIK die einzige Möglichkeit, wie
    du dem Script einen "Parameter" zustellen kannst. Aber wie gesagt: Module sind dafür
    gedacht. Wenn du diese wirklich nicht verwenden möchtest (was ich nicht empfehle),
    dann könntest du im includierten Script eine Funktion schreiben, von welcher du den
    Rückgabewert erhälst bzw. die Parameter übergibst. Aber nur wegen ein, zwei Zeilen
    auf den Gebrauch von Modulen zu verzichten, naja...

    Viele Grüsse

    Philipp

    --
    RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
    Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
    1. Halihallo Helmut

      HalihalloHallöchen Philipp ;)

      my $online_monitor = require "includes/online_monitor.pl";
      auf.
      und in online_monitor.pl hast du ein 'return ...' stehen?

      Ja, habe ich.

      verwendest du 'use strict'?

      Ja, eine Tugend, die ich mir gleich angewöhnt habe ;)

      Das ist AFAIK die einzige Möglichkeit, wie
      du dem Script einen "Parameter" zustellen kannst. Aber wie gesagt: Module sind dafür
      gedacht. Wenn du diese wirklich nicht verwenden möchtest (was ich nicht empfehle),
      dann könntest du im includierten Script eine Funktion schreiben, von welcher du den
      Rückgabewert erhälst bzw. die Parameter übergibst. Aber nur wegen ein, zwei Zeilen
      auf den Gebrauch von Modulen zu verzichten, naja...

      Ich habe hier schon einmal wegen diesem Problem gepostet. Wenn ich mir manche PHP-Projekte ansehe, ist oft auf jeder (HTML-)Seite ein PHP-Skript includet, was z.B. die momentan eingeloggten Benutzer anzeigt.

      Ich arbeite meit dem Modul HTML::Template und wollte eigentlich in jeder Vorlage-Datei so etwas ähnliches einfügen wie eben bei PHP ein "include" bewirkt.

      Mir wurde klar, das meine Denkweise nicht ganz richtig war, und ich in meinem Skript "modularer" denken muss. Gesagt, getan... ich mache ein kleines Script, welches die online-Benutzer ermittelt, in einer Hash-Referenz ablegt und dem Aufrufer zurückgibt. Diese Hash-Referenz kann in Prima an HTML::Template übergeben.

      Wenn ich aber alles in ein Modul packen muss, dies mit "use" einbinden und dann die Funktion aufrufe... naja.... eigentlich hast Du recht... so ein goßer Aufwand ist es wirklich nicht...

      Ich habe für mich auch schon Perl-Module erstellt, die mir das Arbeiten erleichtern. Ich dachte nur, wenn es schon den schönen Befehl "require" gibt, dann nutze ihn doch!

      Danke für Deine Hilfe, werde wohl alles in ein Modul packen ;)
      Schönes Wochenende
      Helmut Weber

      --
      -------------------------------------------
      Mode ist eine Variable, Stil eine Konstante
      1. Halihallo Helmut

        verwendest du 'use strict'?
        Ja, eine Tugend, die ich mir gleich angewöhnt habe ;)

        Je früher, desto besser ;-)

        Mir wurde klar, das meine Denkweise nicht ganz richtig war, und ich in meinem Skript "modularer" denken muss. Gesagt, getan... ich mache ein kleines Script, welches die online-Benutzer ermittelt, in einer Hash-Referenz ablegt und dem Aufrufer zurückgibt. Diese Hash-Referenz kann in Prima an HTML::Template übergeben.

        Der Ansatz des modularen Designs ist ja gut, jedoch die Umsetzung ist IMHO etwas
        "komisch". Wie gesagt, ein Script gibt keine Werte zurück (wenn Perl das macht, naja,
        TIMTOWTDI, aber deswegen ist es dennoch verwirrend und etwas unsauber). Diese Funktion
        gehört in eine Funktion/Prozedur; zumal es auch öfters vorkommt, dass ein Script/Modul
        mehrere Funktionen erfüllt (die einfach dem selben "Problemkreis" angehören) und
        spätestens dann musst du Prozeduren verwenden.

        Ich habe für mich auch schon Perl-Module erstellt, die mir das Arbeiten erleichtern. Ich dachte nur, wenn es schon den schönen Befehl "require" gibt, dann nutze ihn doch!

        require hat schon seine Berechtigung, aber IMHO nicht in diesem Fall. Wie bekannt, ist
        require ein "abgespecktes" use, welches Dateien zur Laufzeit in das Script "einbindet".
        Es ist oftmals viel besser, wenn die gebrauchten Module erst dann eingelesen werden,
        wenn sie auch benutzt werden (mit use lädt man sonst tausende von Modulen ein, die
        evtl. gar nie benutzt werden => Overhead). ABER: require sollte man meiner Meinung nach
        nur zu diesem Zweck einsetzen.

        Viele Grüsse

        Philipp

        --
        RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
        Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.