Tom2 (der authentifizierte): Globales Use in Modulen?

Hi Leute

Wie kann ich in ein Modul einbinden oder schreiben, so dass die darin enthaltenen use-Statements auch für das einbindende Skript gelten? Ich habe mir ein triviales Perl-Modul zum Entwickeln von Webanwendungen erstellt, welches im wesentlichen folgendes enthält:

package WebDebug;

use strict;
use warnings;

You will not show your stupid bugs to the user, wouldn't you?

use CGI::Carp qw(fatalsToBrowser);

Print content type header so everything goes to the browser

print "Content-type: text/html\n\n";

Ich möchte dieses Modul nur solange in ein CGI-Skript einbinden ein, wie ich daran arbeite. Bin ich mit testen durch, so will ich es wieder entfernen.

Doch leider funktioniert es dies nicht wie gewünscht: Weder use strict noch fatalsToBrowser werden auf das einbindende Skript angewandt. Ich versuchte das Skript per use oder per require einzubinden, und auch das Entfernen des package-Statements brachte keinen Erfolg. Hat jemand einen Hinweis?

Gruss & Dank

Tom2

  1. Hell-O!

    Wie kann ich in ein Modul einbinden oder schreiben, so dass die darin enthaltenen use-Statements auch für das einbindende Skript gelten?

    Aus der Dokumentation zu use:

    "Imports some semantics into the current package from the named module, generally by aliasing certain subroutine or variable names into your package."

    "use" und "require" beziehen sich nur auf das aktuelle Package. Möglicherweise gibt es einen dreckigen Weg, das zu erreichen, was du willst, mir ist jedenfalls keiner bekannt.

    Siechfred

    --
    Ich bin strenggenommen auch nur interessierter Laie. (molily)
    Siechfreds Tagebuch || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
  2. Doch leider funktioniert es dies nicht wie gewünscht: Weder use strict noch fatalsToBrowser werden auf das einbindende Skript angewandt. Ich versuchte das Skript per use oder per require einzubinden, und auch das Entfernen des package-Statements brachte keinen Erfolg. Hat jemand einen Hinweis?

    Bist du sicher?
    Bei mir klappt das.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Hell-O!

      Bist du sicher?
      Bei mir klappt das.

      Öhm, bei mir nicht:

      test.pl:

      use myModule;  
        
      $success = get('http://www.anaboe.net/index.html');  
      print $success;
      

      myModule.pm:

      package myModule;  
      use strict;  
      use diagnostics;  
      use LWP::Simple;  
        
      1;
      

      Das Script test.pl bricht mit der Fehlermeldung ab, dass die Methode "get" nicht bekannt sei. Wenn ich den Namensraum explizit angebe:

      $success = myModule::get('http://www.anaboe.net/index.html');

      dann funktioniert es. Das strict-Pragma wird jedoch trotzdem nicht beachtet, und das ist es doch, was Tom2 möchte, oder?

      Siechfred

      --
      Ich bin strenggenommen auch nur interessierter Laie. (molily)
      Siechfreds Tagebuch || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
      1. Bist du sicher?
        Bei mir klappt das.

        Öhm, bei mir nicht:

        test.pl:

        Das ist was anderes, bei deinem Beispiel geht es um eine exportierte MEthode, die natürlich nur im Modul zu Verfügung steht.

        dann funktioniert es. Das strict-Pragma wird jedoch trotzdem nicht beachtet, und das ist es doch, was Tom2 möchte, oder?

        Nach seinem Beispiel nicht.
        sowohl der Print Befehl wird ausgeführt, auch das Modul wird eingebunden und ist wirksam. Eine Methode die er verwenden möchte ist dort nicht aufgehführt.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
      2. Hallo

        Das strict-Pragma wird jedoch trotzdem nicht beachtet, und das ist es doch, was Tom2 möchte, oder?

        Genau das möchte ich. Tja, schade dass es nicht geht.  Trotzdem vielen Dank für eure Hilfe.

        Gruss

        Tom2

        1. Das strict-Pragma wird jedoch trotzdem nicht beachtet, und das ist es doch, was Tom2 möchte, oder?

          Genau das möchte ich. Tja, schade dass es nicht geht.  Trotzdem vielen Dank für eure Hilfe.

          Natürlich geht das, du solltest nur sagen was du genau willst.

          Struppi.

          --
          Javascript ist toll (Perl auch!)
          1. Das strict-Pragma wird jedoch trotzdem nicht beachtet, und das ist es doch, was Tom2 möchte, oder?
            Genau das möchte ich. Tja, schade dass es nicht geht.  Trotzdem vielen Dank für eure Hilfe.
            Natürlich geht das

            Ja? Wie?

            Siechfred

            --
            Ich bin strenggenommen auch nur interessierter Laie. (molily)
            Siechfreds Tagebuch || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
            1. Natürlich geht das

              Ja? Wie?

              also nochmal zur Ausgangsfrage:

              Ich möchte dieses Modul nur solange in ein CGI-Skript einbinden ein, wie ich daran arbeite. Bin ich mit testen durch, so will ich es wieder entfernen.

              Doch leider funktioniert es dies nicht wie gewünscht: Weder use strict noch fatalsToBrowser werden auf das einbindende Skript angewandt. Ich versuchte das Skript per use oder per require einzubinden, und auch das Entfernen des package-Statements brachte keinen Erfolg. Hat jemand einen Hinweis?

              WebDebug.pm

                
              package WebDebug;  
              use CGI::Carp qw/fatalsToBrowser/;  
              print "Content-type: text/html\n\n";  
              1;  
              
              

              test.pl

              #!/usr/bin/perl -w  
                
              # Aufruf der Funktionen  
              use strict;  
              use WebDebug;  
              $xx =
              

              Ausgabe:
              Content-type: text/html

              [Mon Nov 27 13:15:27 2006] test.pl: Global symbol "$xx" requires explicit package n
              ame at x.pl line 7.
              [Mon Nov 27 13:15:27 2006] test.pl: syntax error at test.pl line 7, at EOF
              Content-type: text/html

              <h1>Software error:</h1>
              <pre>Execution of test.pl aborted due to compilation errors.
              </pre>
              <p>
              For help, please send mail to this site's webmaster, giving this error message
              and the time and date of the error.

              </p>
              [Mon Nov 27 13:15:27 2006] x.pl: Execution of x.pl aborted due to compilation errors.

              zumindest CGI::Carp wird bei mir ausgeführt, use strict wirkt immer nur in dem package in dem es eingebunden wird.

              Struppi.

              --
              Javascript ist toll (Perl auch!)
              1. use strict wirkt immer nur in dem package in dem es eingebunden wird.

                Ich glaube, dass ich die Lösung für Toms Problem gefunden habe.

                Siechfred

                --
                Ich bin strenggenommen auch nur interessierter Laie. (molily)
                Siechfreds Tagebuch || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
                1. use strict wirkt immer nur in dem package in dem es eingebunden wird.

                  Ich glaube, dass ich die Lösung für Toms Problem gefunden habe.

                  Jaja, ich lese mit ;-)

                  Struppi.

                  --
                  Javascript ist toll (Perl auch!)
          2. *Asche auf's Haupt streu* ich hab's rausgefunden. Der Schlüssel ist eine Kombination aus @ISA und require:

            package myModule;  
            require strict;  
            require diagnostics;  
            @ISA = qw(strict diagnostics);  
              
            1;
            

            Und schon meckert Perl auch in test.pl rum.

            Siechfred

            --
            Ich bin strenggenommen auch nur interessierter Laie. (molily)
            Siechfreds Tagebuch || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
            1. *Asche auf's Haupt streu* ich hab's rausgefunden. Der Schlüssel ist eine Kombination aus @ISA und require:

              oder einfach:
              use base qw(strict diagnostics);

              auf die Idee bin ich noch gar nicht gekommen

              Struppi.

              --
              Javascript ist toll (Perl auch!)
              1. Der Schlüssel ist eine Kombination aus @ISA und require
                oder einfach:
                use base qw(strict diagnostics);

                Hätte ich mir denken können, dass es da was von Ratiopharm gibt ;-)

                auf die Idee bin ich noch gar nicht gekommen

                Ich zuerst auch nicht, ich war auf das "use" fixiert.

                Siechfred

                --
                Ich bin strenggenommen auch nur interessierter Laie. (molily)
                Siechfreds Tagebuch || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.