modularer variablenpool
björn.sippel
- perl
1 Helmut Weber0 Bjoern
0 Matti Maekitalo1 Bjoern
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
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
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
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
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);
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