Globale Variablen
Bogdan Stupka
- perl
0 Siechfred0 Bogdan Stupka0 Siechfred0 Bogdan Stupka
0 Struppi
Hallo,
wie kann man die globale Variablen aus einer Datei benutzen?
Ich habe sowas geschrieben:
----------in der Datei Global.pm---------------
package Global;
$a = 3;
$b = 4;
1;
-----------------------------------------------
--------in der Datei test.pl-------------------
#!/usr/bin/perl -w
use strict 'vars';
use CGI::Carp qw(fatalsToBrowser);
use Cwd;
use Global;
print "Variable $a und $b \n";
-----------------------------------------------
???
Tag Bogdan.
wie kann man die globale Variablen aus einer Datei benutzen?
Siehe http://de.selfhtml.org/perl/module/intro.htm
Siechfred
Das Link habe ich bereits studiert und konnte leider nichts sinnvolles für mich finden.
Die Fehlermeldung ist noch immer wie vorher:
Global symbol "$a" requires explicit package name at /home/user/webserver/cgi/test.pl line XX.
etc.
Das Link habe ich bereits studiert und konnte leider nichts sinnvolles für mich finden.
Wirklich? Bist du auch bis zum Abschnitt Packages und Module (Erläuterungen zum Beispiel) vorgedrungen? Dein Stichwort lautet "Namensräume".
Siechfred
Wirklich? Bist du auch bis zum Abschnitt Packages und Module (Erläuterungen zum Beispiel) vorgedrungen? Dein Stichwort lautet "Namensräume".
Ich glaube ich weiss, woran es liegt... Der Perl-Interpreter kann die -global.pm nicht finden, weil er in @INC sucht...
Wie kann ich ihm vorschreiben, dass er da auch sucht, wo der Skript liegt?
Danke.
Hallo Bogdan,
Ich glaube ich weiss, woran es liegt... Der Perl-Interpreter kann die -global.pm nicht finden, weil er in @INC sucht...
Wie kann ich ihm vorschreiben, dass er da auch sucht, wo der Skript liegt?
perl macht das. ansonsten gibts da noch das lib pragma
poste lieber nochmal deinen code, ich vermute der ist noch nicht korrekt.
Gruß,
Benne
poste lieber nochmal deinen code, ich vermute der ist noch nicht korrekt.
Der Code steht in der Frage. Mehr wollte ich nicht.
Ich glaube ich weiss, woran es liegt... Der Perl-Interpreter kann die -global.pm nicht finden, weil er in @INC sucht...
Nein, er findet "Global.pm", sonst würde er nicht die von dir gepostete Fehlermeldung werfen. Lass dir mal "Global symbol '$a' requires explicit package name" auf der Zunge zergehen, dann lies bitte nochmal die Seite, deren Link ich dir gegeben habe.
So, und nun nochmal:
package Globals;
$a = 3;
$b = 4;
1;
Frage: wie heißt der Namensraum, zu dem die Variablen $a und $b gehören?
[ ] main
[ ] Globals
Und weiter:
use strict 'vars';
use CGI::Carp qw(fatalsToBrowser);
use Cwd;
use Globals;
print "Variable $a und $b \n";
Frage: in welchem Namensraum sucht Perl die Variablen $a und $b?
[ ] main
[ ] Globals
Wenn deine Antwort auf beide Fragen die gleiche ist, dann hast du in der Tat die von mir gepostete Seite nicht aufmerksam genug gelesen. Sehr ausführlich ist das Ganze übrigens in perlmod beschrieben.
Siechfred
Frage: wie heißt der Namensraum, zu dem die Variablen $a und $b gehören?
[ ] main
[ ] Globals
$a ist Globals würde ich schreiben und $b - main.
Frage: in welchem Namensraum sucht Perl die Variablen $a und $b?
[ ] main
[ ] Globals
$a im Globals und $b im main?..
Frage: wie heißt der Namensraum, zu dem die Variablen $a und $b gehören?
[ ] main
[ ] Globals
$a ist Globals würde ich schreiben und $b - main.
Nein, beide im Namensraum Globals. Sie sind innerhalb des Packages "Globals" notiert.
Frage: in welchem Namensraum sucht Perl die Variablen $a und $b?
[ ] main
[ ] Globals
$a im Globals und $b im main?..
Nein, so, wie du es im Script schreibst, im Namensraum "main", da kein anderer explizit angegeben wurde. Siehe auch Struppis Posting.
Siechfred
Hallo Bogdan Stupka
Hallo,
wie kann man die globale Variablen aus einer Datei benutzen?
Ich habe sowas geschrieben:
----------in der Datei Global.pm---------------
package Global;
$a = 3;
$b = 4;1;
--------in der Datei test.pl-------------------
#!/usr/bin/perl -w
use strict 'vars';
use CGI::Carp qw(fatalsToBrowser);
use Cwd;use Global;
print "Variable $a und $b \n";
Ein altes und immer wieder gern gefragtes Problem.
Die Lösung wäre Exporter. d.h. du musst jede einzelne Variabel in den main Namespace exortieren.
use Exporter;
@EXPORT = qw(a b);
Was aber oft zu umstandlich ist. eine zweite Lösung wäre die Variabeln dierekt anzusprechen über das package:
use Global;
print "Variable $Global::a und $Global::b \n";
was den Vorteil hat, dass du sofort siehst woher die Variabel kommt.
Oder, falls es viele Variabeln sind aus einer Ini Datei, dann bietet sich nich an nur eine HASH Variabel zu exportieren und jeweil auf die Schlüssel zu zugreifen.
Struppi.
Tag Struppi.
Die Lösung wäre Exporter. d.h. du musst jede einzelne Variabel in den main Namespace exortieren.
Halte ich für gefährlich, da sich die exportierten Variablen im importierenden Script im gleichen Namensraum ("main") wie die Scriptvariablen selber befinden. Gerade bei den von Bogdan verwendeten Allerweltsnamen $a und $b kann es dabei zu Konflikten kommen.
Siechfred
Die Lösung wäre Exporter. d.h. du musst jede einzelne Variabel in den main Namespace exortieren.
Halte ich für gefährlich, da sich die exportierten Variablen im importierenden Script im gleichen Namensraum ("main") wie die Scriptvariablen selber befinden. Gerade bei den von Bogdan verwendeten Allerweltsnamen $a und $b kann es dabei zu Konflikten kommen.
Zumal die auch reserviert sind, aber ich vermute mal das die andere Namen haben und das nur ein Beispiel war.
Aber du hast recht man sollte sich immer zweimal überlegen ob man eine Variabel exportieren möchte. daher bevorzuge ich auch die Variante mit dem package Namen, die aber den Nachteil hat, dass use strict ins leere läuft.
Struppi.