björn.sippel: modularer variablenpool

Hallo zusammen,

Ich möchte gerne einen Modul(?)-Pool anlegen, in welchem die
(von mir) gängigen Variablen hinterlegt sind, ohne diese
jedesmal neu im Code deklarieren zu müssen.

Also einfach ein ->use xyz::variablen<- (wie auch immer) und
die typischen Variablen sind eingebunden.

Eine weitere Möglichkeit ist natürlich mit:
my ($v1, $v2, @abc, ....);

Den Modulversuch habe ich gemacht, leider ist hier im "normalen"
Fall bei der Rückgabe der Variablen der Effekt wieder hin,
da im Modul nur lokale Variablen vorhanden sind.
Und als Rückgabewert habe ich bisher nur die Möglichkeit
mit genau einem Rückgabewert gesehen.

Als "Testtool" diente einfach die Anweisung : use strict

Hat jemand eine Idee, wie ein solcher allgemeiner Variablenpool
angelegt werden kann ?

vielen Dank,
Björn Sippel

  1. Hallo Björn,

    ich lege meine Variablen, die für alle Skripte eines Projektes gültig sind, in eine separate Datei ab:

    config/default.cfg:
    $variable1  = 'wert';
    $variable2  = 5;
    ...

    In meinen Skripten binde ich diese Datei wie folgt ein:
    { package Config; do 'config/default.cfg' }

    In meinen Skripten kann ich dann über $Config::db_variable1 auf die gewünschte Variable zugreifen. Die Methode funktioniert auch mit use strict;.

    Variablen zwischen mehreren Skripten kannst Du nicht austauschen, da die Variablen nur aus der Datei gelesen werden, und nicht wieder zurück geschrieben.

    Gruß
    Helmut Weber

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

      vielen Dank für die Antwort. Habe jetzt dazu einige Fragen:

      config/default.cfg:
      $variable1  = 'wert';
      $variable2  = 5;
      ...

      -->> an welcher Stelle im Dateibaum muss diese Datei abgelegt
      werden ? Unterverzeichnis Config unter perl\site\lib  ?
      Oder wird hier die config.pm angesprochen unter perl\lib ?

      In meinen Skripten binde ich diese Datei wie folgt ein:
      { package Config; do 'config/default.cfg' }

      In meinen Skripten kann ich dann über $Config::db_variable1 auf die gewünschte Variable zugreifen. Die Methode funktioniert auch mit use strict;.

      -->>was bedeutet hier jetzt "$Config::db_variable1" ?
      Speziell "db_". Oben hattest Du als Beispiel $variable1 genannt.
      Wie spreche ich diese an ?

      -->> Gibt es überhaupt keine Möglichkeit, über den Export aus einem
      Modul eine "Datenliste" zurückzugeben? Schaut man in die Config.pm,
      wird hier wohl ein Hash zurück gegeben? Allerdings sind meine
      Kenntnisse in Bezug auf Hashes sehr gering, verwende lieber
      Array's.

      Zu guter Letzt: Ich habe nochmals gegoogelt und "deine" Lösung
      wieder gefunden, unter anderem unter:
      http://www.perlunity.de/perl/forum/thread_017061.shtml

      Allerdings wird im Hauptprogram die
      gewünschte Variable nochmals explizit mit :
      -> my $var = $Config::test1;

      definiert.

      Ich möchte jedoch die Variable NUR DEKLARIEREN, jedoch noch keinen
      Wert zuweisen !!!!!.

      Ich will also überhaupt nicht "my $var;" schreiben müssen, da sonst
      use strict meckert. In meinen bisherigen Programmen habe ich immer
      ca. 20 bis 30 Variablen beieinander, und hätte diese gerne
      in einem Topf! Dazu kommen dann noch ein paar Variablen mit festem
      Wert, steht jedoch im Moment nicht im Vordergrund.

      Ich könnte auch in deiner Version einen Teil der Variablen
      einfach auf "NULL" setzen, und dann damit arbeiten ?

      Gruss,
      Björn

      1. Hallo Bjoern,

        vielen Dank für die Antwort. Habe jetzt dazu einige Fragen:

        config/default.cfg:
        $variable1  = 'wert';
        $variable2  = 5;
        ...
        -->> an welcher Stelle im Dateibaum muss diese Datei abgelegt
        werden ? Unterverzeichnis Config unter perl\site\lib  ?
        Oder wird hier die config.pm angesprochen unter perl\lib ?

        default.cfg ist in meinem Beispiel eine normale Textdatei, die Du entweder mit dem absoluten Pfad des Dateisystems oder dem relativen Pfad vom Skript aus einbinden kannst.

        In meinen Skripten binde ich diese Datei wie folgt ein:
        { package Config; do 'config/default.cfg' }

        In meinen Skripten kann ich dann über $Config::db_variable1 auf die gewünschte Variable zugreifen. Die Methode funktioniert auch mit use strict;.
        -->>was bedeutet hier jetzt "$Config::db_variable1" ?
        Speziell "db_". Oben hattest Du als Beispiel $variable1 genannt.
        Wie spreche ich diese an ?

        Entschuldigung, dass war ein Tippfehler! Es muss natürlich heißen: "$Config::variable1".
        Mittels dem Befehl "package" wechsele ich in einen anderen Namensraum (in diesem Beispiel "Config"). Im Geltungsbereich dieses Namensraums führe ich nun die die Datei "config/default.cfg" aus. In dieser Datei habe ich nur ganz normale Variablen abgelegt. Es könnten aber auch Berechnungen oder ganze Funktionen in dieser Datei vorhanden sein.
        Um in meinem Skript nun eine Variable aus dieser Datei anzusprechen, muss ich den dazugehörigen Namesraum angeben "$Config::variable1". Gibst Du keinen Namensraum an, geht Perl immer davon aus, dass Du den $main-Namensraum meinst. Anstatt also "$variable1" kannst Du auch "$main::variable1" schreiben.

        Allerdings wird im Hauptprogram die
        gewünschte Variable nochmals explizit mit :
        -> my $var = $Config::test1; definiert.

        Ich möchte jedoch die Variable NUR DEKLARIEREN, jedoch noch keinen
        Wert zuweisen !!!!!.

        Da es sich in meinem Beispiel um gewöhliche Variablen handelt, brauchst Du diesen auch keinen Wert zuweisen. Da es sich dabei aber um Variablen handelt, die in allen Skripten gültig sein sollen, macht es keinen Sinn Variablen extern zu deklarieren und diese dann im Skript mit Werten zu füllen. Dazu sind lokale Variablen besser geeignet. Aber evtl. verstehe ich deinen Anwendugsfall noch nicht ganz genau!

        Wie gesagt, mit meiner Methode kannst Du nur eine Datei in deine Skripte einbinden, in der Du Variablen und Werte ablegst, die für alle Skripte gültig sind. Also eine globale Konfigurationsdatei! Wenn Du in einem Skript den Wert einer Variable änderst, bekommen die anderen Skripte diese Änderung nicht mit!

        Gruß
        Helmut Weber

        --
        -------------------------------------------
        Mode ist eine Variable, Stil eine Konstante
  2. use Mosche;

    Hat jemand eine Idee, wie ein solcher allgemeiner Variablenpool
    angelegt werden kann ?

    Da wirst du wohl das Modul Exporter benötigen. Schau mal in  'perldoc Exporter'

    use Tschoe qw(Matti);

    --
    Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
    Webapplikationen in C++ entwickeln
    1. Hallo,

      use Mosche;

      -->> ?? Spass oder Ernst

      Da wirst du wohl das Modul Exporter benötigen. Schau mal in  'perldoc Exporter'

      -->>ich hatte in meiner Anfrage bereits erwähnt, dass ich ein
      Modul bereits geschrieben hatte. Ohne  "Exporter" geht da sowieso nichts :-).

      Oder habe ich hier etwas übersehen ?

      use Tschoe qw(Matti);

      -->>  (?)

      Also, die Doku zu Exporter habe ich bereits soweit durch,
      um Werte aus Modulen zu exportieren.

      Vielleicht kannst Du ja ein kurzes Beispiel geben ?

      Hier mein Beispiel:
      Die Variablen sollen nach dem Aufruf der Funktion zdefine
      zur Verfügung stehen.

      .............................................................
      package sipp::variables;

      use cgi;
      #use strict;

      use Exporter;
             @ISA = qw(Exporter);
             @EXPORT = qw(zdefine);
             my @EXPORT_OK = qw();

      sub zdefine
      {
      my $z1;my $z2;my $z0;my $a;my $b;my $swKey;my @key_names;my $z1;

      #return $status;
      }
      1;
      .................................................................

      Gruss,
      Bjoern