Problem beim Einbinden von Modul (Unix)

Hallo,

ich habe ein Modul „MyFunctions.pm“, das ich mittels „use MyFunctions;“ in mein CGI-Skript einbinde. Eine darin enthaltene Funktion „TestVar()“ rufe ich dann einfach mit ihrem Namen auf.

Auf meinem Entwicklungs-Server (PWS unter Win98-Rechner mit ActivePerl5) läuft das Skript sowohl unter DOS (direkt mit Perl), als auf im Browser tadellos.

Problem: Wenn ich das Skript auf einen Unix-Server lade, wird das Skript gar nicht erst ausgeführt, sondern mit dem folgenden Fehler abgebrochen:

Can't call method "import" in empty package "MyFunctions" at test3.cgi line 4.
BEGIN failed--compilation aborted at test3.cgi line 4.

Wenn ich nun im Modul einfach ein „package MyFunctions;“ oben hinzufüge und die Funktionen im Skript auf die Weise „MyFunctions::TestVar()“ aufrufe, dann geht´s. Aber ich wollte mir das „MyFunctions::“ eigentlich sparen. Geht das irgendwie?

Auch sonst ist der Unix-Server recht penibel, was CGI angeht. Das „use CGI::Carp qw(fatalsToBrowser);“ funktioniert auch nicht (gleiche Fehlermeldung wie oben), und der Browser zeigt bei jeder Perl-Meldung einfach „Server Error“ an. Debugging ist da praktisch unmöglich. Der Windows-Server ist da geschmeidiger: Der verschluckt die Meldungen einfach und macht weiter. Die fehlerhafte Ausgabe wird dann einfach übersprungen.

Ich danke für eventuelle Hinweise!
Kristian

Hallo !

Can’t call method
„import“ in empty package „MyFunctions“ at test3.cgi line 4.
BEGIN failed–compilation aborted at test3.cgi line 4.

Wenn ich nun im Modul einfach ein „package MyFunctions;“ oben
hinzufüge und die Funktionen im Skript auf die Weise
„MyFunctions::TestVar()“ aufrufe, dann geht´s. Aber ich wollte
mir das „MyFunctions::“ eigentlich sparen. Geht das irgendwie?

Wahrscheinlich findet er das nicht im @INC - Pfad. Unter Windows ist da evtl. „.“ mit dabei, bei Linux nicht.

use lib '/verzeichnis';
use MyFunctions;

davor könnte helfen.

Auch sonst ist der Unix-Server recht penibel, was CGI angeht.
Das „use CGI::Carp qw(fatalsToBrowser);“ funktioniert auch
nicht (gleiche Fehlermeldung wie oben), und der Browser zeigt

CGI::Carp ist dann nicht insatlliert bzw. auch nicht im Include-Pfad.

bei jeder Perl-Meldung einfach „Server Error“ an. Debugging

Ohne CGI::Carp normal, da der Server auf einen gültigen Header wartet, wenn der nicht kommt (sondern ne Fehlermeldung) gibt’s nen 500 (Die Meldung dazu steht immer error_log des Servers).
CGI::Carp ist reines Perl und sollte sich auch im Benutzerverzeichnis installieren lassen.

Alexander

Hm …

Wahrscheinlich findet er das nicht im @INC - Pfad. Unter
Windows ist da evtl. „.“ mit dabei, bei Linux nicht.

Ich dachte, das wäre immer dabei. Aber davon unabhängig: Wenn ich das mit „Package“ mache, findet er die Datei ja offenbar. Oder ist da ein anderer Pfad, als der in @INC relevant?

> use lib '/verzeichnis';  
> use MyFunctions;

davor könnte helfen.

Hatte ich auch schon mal probiert, glaube ich. Muß ich nochmal wiederholen vielleicht.

CGI::Carp ist reines Perl und sollte sich auch im
Benutzerverzeichnis installieren lassen.

Hatte ich auch schon gedacht. War mir aber etwas zu kompliziert auf den ersten Blick. Im @INC-Verzeichnis des Servers liegt das übrigens drin.

Alexander

Kristian

Hallo !

Wahrscheinlich findet er das nicht im @INC - Pfad. Unter
Windows ist da evtl. „.“ mit dabei, bei Linux nicht.

Ich dachte, das wäre immer dabei. Aber davon unabhängig: Wenn
ich das mit „Package“ mache, findet er die Datei ja offenbar.
Oder ist da ein anderer Pfad, als der in @INC relevant?

package macht soweit ich weiss etwas komplett anderes (Definition eines Namensraumes). Verwechselst du das mit require ? das nimmt aber auch @INC.

use lib ‚/verzeichnis‘;
use MyFunctions;

davor könnte helfen.

Hatte ich auch schon mal probiert, glaube ich. Muß ich nochmal
wiederholen vielleicht.

CGI::Carp ist reines Perl und sollte sich auch im
Benutzerverzeichnis installieren lassen.

Hatte ich auch schon gedacht. War mir aber etwas zu
kompliziert auf den ersten Blick. Im @INC-Verzeichnis des
Servers liegt das übrigens drin.

Dann läuft da irgend was anderes schief, wenn es in einem der @INC Verzeichnisse das Verzeichnis CGI und darin die Carp.pm gibt…

Da du vorher Windows gemacht hast: evtl. irgendwelche Groß/Kleinschreibungsprobleme in Dateinamen ?

Alexander

package macht soweit ich weiss etwas komplett anderes
(Definition eines Namensraumes). Verwechselst du das mit
require ? das nimmt aber auch @INC.

Genau so habe ich es auch verstanden mit package, und deshalb verstehe ich auch um so weniger, daß es so funktioniert :wink: Der Unterschied zwischen use und require sollte hier keine Rolle spielen. Kann ich aber nochmal probieren.

Dann läuft da irgend was anderes schief, wenn es in einem der
@INC Verzeichnisse das Verzeichnis CGI und darin die Carp.pm
gibt…

Eine kleine Ursache könnte es noch geben: Das Carp-Zeug habe ich auf dem sog. Development-Server gesehen. Die Applikationen laufen am Ende aber auf dem Production-Server. Da kann ich nichtr draufgucken, aber der sollte eigentlich von der Systemumgebung her ein Spiegel des ersten sein.

Da du vorher Windows gemacht hast: evtl. irgendwelche
Groß/Kleinschreibungsprobleme in Dateinamen ?

Nö, eigentlich nicht. Sind ja alles Standard-Module.

Na egal. Solange es funktioniert mit Package - warum auch immer - bin ich ja zufrieden :wink:

Danke jedenfalls für´s Kopfzerbrechen!
Kristian