Globales Use in Modulen?
Tom2 (der authentifizierte)
- perl
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;
use CGI::Carp qw(fatalsToBrowser);
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
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
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.
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
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.
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
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.
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
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.
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
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.
*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
*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.
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