Albert: Prozeduren in Modul nicht aufrufbar

Hallo!

Ich habe mich an einem Problem ziemlich festgebissen und komme einfach nicht mehr weiter.

Ich habe Win2K mit SP3 auf meinem neuen Notebook installiert. Dazu Apache2 (2.0.39) und ActiveState Perl 5.6.1 (build 633). Ich habe (hoffentlich) alles konfiguriert, prinzipiell läuft es. Ich habe allerdings mit allen Skripten Probleme, die Subroutinen in selbstgeschriebenen Modulen aufrufen. Ich habe stundenlang versucht den Fehler einzugrenzen, finde aber nichts.

Das Skript a.cgi sieht wie folgt aus:
use test;

print "Content-type...

my $instanz = test->new();

Das Modul test.pm, im selben Verzeichnis liegend sieht ca. so aus:
package test;

sub new
{
  print "Test erfolgreich";
}

1;

mit use CGI::Carp qw(fatalsToBrowser); konnte ich feststellen, dass nicht der Aufruf des Moduls, das Problem ist, sondern der Aufruf der Funktion. Wenn ich use x, verwende (Modul gibts nicht), kommt es "brav" dort zum Fehler. Ich habe @INC geprüft, dort passt auch alles (2 Verzeichnisse von Perl und . für das aktuelle Verzeichnis)

Ich kann also nur darauf schließen, dass das Modul erfolgreich geladen wird, aber dann tatsächlich der Aufruf nicht funktioniert. Am Browser wird dieser Fehler und diese Zeilennummer ausgegeben (und natürlich, dass das Package wahrscheinlich nicht geladen ist :-(

Die Skripte sind sicherlich auch korrekt, weil ich sie bereits auf Apache 1.3 unter WinNT4 mit Ative Perl build 522 laufen und nur überspielt wurden.

Wenn ich das Package direkt in das Skript a.cgi integriere, funktioniert alles hingegen. Ich hatte dasselbe Problem bereits bei einem Kunden. Der IT-Manager hat ActivePerl installiert und meine Skripte liefen dort erst, nachdem ich das Package direkt in das Skript gespielt habe.

lieben Dank für Eure Hilfe
Albert

  1. Hallo!

    Tach,

    Das Modul test.pm, im selben Verzeichnis liegend sieht ca. so aus:
    package test;

    sub new
    {
      print "Test erfolgreich";
    }

    1;

    Ich bin ja kein Perl-Spezialist, aber wenn ich mich richtig erinnere, muß man doch die nach außen zugänglichen Methoden einen Moduls als solche deklarieren, zumindest steht sowas in
    perldoc perlmod
    drin.

    Andreas

    1. Hi!

      Ich bin ja kein Perl-Spezialist, aber wenn ich mich richtig erinnere, muß man doch die nach außen zugänglichen Methoden einen Moduls als solche deklarieren, zumindest steht sowas in
      perldoc perlmod
      drin.

      Werds mal genau lesen. Warum gings aber bisher so? Is da eine striktere Handhabung?

      Warum ist dann unter http://selfhtml.teamone.de/cgiperl/sprache/objekte.htm
      auch alles so?

      Trotzdem Danke
      Albert

      1. use Mosche;

        Ich bin ja kein Perl-Spezialist, aber wenn ich mich richtig erinnere, muß man doch die nach außen zugänglichen Methoden einen Moduls als solche deklarieren, zumindest steht sowas in
        perldoc perlmod
        drin.

        Werds mal genau lesen. Warum gings aber bisher so? Is da eine striktere Handhabung?

        Warum ist dann unter http://selfhtml.teamone.de/cgiperl/sprache/objekte.htm
        auch alles so?

        Das ist vor allem Dingen dann sinnvoll, wenn du 'strict' benutzt. Benutze dann einfach den 'Exporter'. Anosnsten fiele mir noch ein, dass du vielleicht einen gesperrten Namen benutzt ('test'), aber ich denke nicht, dass _das_ ein Grund für den Fehler sein könnte.

        use Tschoe qw(Matti);

        1. Hi!

          Werds mal genau lesen. Warum gings aber bisher so? Is da eine striktere Handhabung?

          Warum ist dann unter http://selfhtml.teamone.de/cgiperl/sprache/objekte.htm
          auch alles so?

          Ich habe da jetzt etwas herumgelesen. Wie ich es sehe, kann ich Funktionen und Variablen exportieren, muss aber nicht. Insbesondere, wenn das Modul als Klasse (OOP) verwendet werden soll. Bei meinen Modulen handelt es sich eigentlich darum. Der Konstruktor new ruft evtl. die Initialisierung auf und gibt eine Referenz auf das Objekt zurück:

          my $ObjektRef = modul->new( parameter );

          In meinem Test-Modul war alles sehr abgekürzt, daher kommt auch keine Referenz zurück, das ist aber nicht der Fehler, denn auch bei den vorher funktionierenden Modulen/Klassen gibts denselben Fehler.

          Dankbar für jede Hilfe
          Albert

          1. Hallo Albert

            Ich habe Dein Beispielcode genommen und bei mir getestet und folgende Fehlermeldung erhalten:

            Can't locate object method "new" via package "test" (perhaps you forgot to load "test"?) at C:/Projects/cgi-bin/test.pl line 27.

            Ich nehme an, das es derselbe Fehler ist, wie Du ihn hattest.

            Als ich den Namen des Moduls von 'test' auf 'testx' geändert habe, lief der Aufruf von testx->new() erfolgreich.

            Ich hoffe, das hilft.

            Grüsse
            Eisbär