Bogdan Stupka: Globale Variablen

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";

-----------------------------------------------

???

  1. Tag Bogdan.

    wie kann man die globale Variablen aus einer Datei benutzen?

    Siehe http://de.selfhtml.org/perl/module/intro.htm

    Siechfred

    1. Siehe http://de.selfhtml.org/perl/module/intro.htm

      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.

      1. 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

        1. 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.

          1. 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

            --
            ie:% fl:( br:> va:) ls:> fo:| rl:° ss:) de:[ js:| ch:| mo:} zu:)
            1. poste lieber nochmal deinen code, ich vermute der ist noch nicht korrekt.

              Der Code steht in der Frage. Mehr wollte ich nicht.

          2. 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

            1. 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?..

              1. 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

  2. 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.

    1. 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

      1. 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.