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