Stefan Janssen: Probleme mit require und Variablen-Definition

Hallo,

ich habe in einem Perl-Script mehrere Variablen deklariert:

unter anderem diese:

my $Schriftart = "Arial";
my $Schriftgroesse = "2";
my $Schriftfarbe = "#ffff00";
my $Hintergrundfarbe = "#0000ff";

und noch viele andere.

Nun wollte ich das ganze etwas übersichtlicher und User-freundlicher gestalten, indem ich die Variablen in eine separate Datei (config.pl) auslagere und diese Datei mit require "config.pl"; von dem Script ausführen lasse.

Die Datei enthielt (probeweise) ausschließlich die o.a. 4 Zeilen. Beim Aufruf des Hauptscriptes erhielt ich nun für jede Zeile in der die Variablen vorkommen Fehlermeldungen in der Art:

Global symbol "$Schriftart" requires explicit package name at C:\HTTPD\CGI-BIN\beta.pl line 203
(also undefinierte Variablen?!?! Und das verstehe ich beim besten Willen nicht.)

Nach einigen Überlegungen und verzweifeltem "rumprobieren" fand ich heraus, dass mein Vorhaben dann funktioniert, wenn ich in config.pl alle "my" und im Hauptscript "use strict;" weglasse.

Jetzt funktioniert es zwar, aber ich wüsste doch zu gerne, wie ich vorgehen muss, damit ich im Hauptscript wieder "use strict;" einsetzen kann.

Gruß
Stefan

  1. hi!

    Jetzt funktioniert es zwar, aber ich wüsste doch zu gerne, wie ich
    vorgehen muss, damit ich im Hauptscript wieder "use strict;"
    einsetzen kann.

    Dazu musst du den Namensbereich angeben, in dem sich die Variablen
    befinden, auf die du zugreifen willst. Um das ganze etwas sauberer
    zu machen, würde ich dir außerdem empfehlen, Module zu verwenden.
    Ein einfaches Beispiel:

    === cut: test.pl ===
    #!/usr/bin/perl

    use strict;
    use MyOwnModule;

    print MyOwnModule::$modvar;
    === cut ===

    === cut: MyOwnModule.pm ===
    package MyOwnModule;

    my $modvar = "irgendwas";

    1;
    === cut ===

    Durch den :: kannst du also für eine Variable den Namensbereich
    angeben, in dem sie vorkommt. Die 1; am Ende des Moduls braucht man,
    damit das Modul einen wahren Rückgabewert hat.

    bye, Frank!

    1. Hi,

      das mit dem Modul war der entscheidende Hinweis. Ich war mir halt nicht sicher, ob use Modul; oder require "script.pl"; vorteilhafter ist.
      Mit dem Modul funktioniert's jetzt einwandfrei.

      thx, cu & Gute N8!

      SJ

      1. das mit dem Modul war der entscheidende Hinweis. Ich war mir halt nicht sicher, ob use Modul; oder require "script.pl"; vorteilhafter ist.
        Mit dem Modul funktioniert's jetzt einwandfrei.

        Ich würde
        do 'script.pl';
        vorschlagen. Das tut, was du anfangs von require erwartet hast.

        Die Details gibts unter

        perldoc -f do
        perldoc -f require
        perldoc -f use

        HTH,
        Steffen

  2. Ach ja, an das Ende von config.pl hatte ich natürlich 1; geschrieben. Weiß der Teufel wofür das gut ist. Vielleicht kann mir bei der Gelegenheit jemand auch erklären, was in dem Satz

    "Eingebundene Perldateien müssen am Ende so etwas wie 1; enthalten. Dadurch wird sichergestellt, dass das Modul oder die Modulfunktion korrekt ausgeführt wird."
    (Zitat SelfHTML8.0 cgiperl\funktionen\module.htm)

    die Aussage "so etwas wie 1;" bedeutet.

    etwa:

    2; ?
    x; ?
    Dateiende; ?

    Danke schonmal für eure Bemühungen.

    Gruß
    Stefan

    1. hi!

      Ach ja, an das Ende von config.pl hatte ich natürlich 1;
      geschrieben. Weiß der Teufel wofür das gut ist. Vielleicht kann mir
      bei der Gelegenheit jemand auch erklären, was in dem Satz

      Hab ich doch geschrieben, was das bedeutet. Jedes Modul muss einen
      Wert als Rückgabewert haben, und zwar einen wahren. Ob du ans Ende
      der Datei 1; oder 42; schreibst, ist dann aber egal. Nur muss da halt
      irgendwas in der Art stehen.

      bye, Frank!