MoD: Modul nicht gefunden ?

Hi Leute,

hab ein kleines Prob mit meinem Perl-Script für Mailversand.

Das Script denke ich funktioniert, allerdings bringt der Browser folgende Fehlermeldung:

Can't locate object method "Remote" via package "IP" (perhaps you forgot to load "IP"?) at mail.pl line 48

Ist IP ein Modul ? (Hab es nämlich bei SelfHTML nicht gefunden)

Oder muß ich noch eine Umgebungsvariable reinladen ?

danke für Eure Antworten

MoD

  1. hallo MoD,

    Das Script denke ich funktioniert, allerdings bringt der Browser folgende Fehlermeldung:
    Can't locate object method "Remote" via package "IP" (perhaps you forgot to load "IP"?) at mail.pl line 48

    Das ist eher ein deutlicher Hinweis darauf, daß dein Script eben _nicht_ funktioniert  -  oder jedenfalls nicht so, wie du es gerne haben möchtest.
    Wenn dir der Browser so etwas sagt, was sagt dann die Konsole (Eingabeaufforderung)? Ruf dein Script einmal mit "perl mail.pl" auf.
    Und was steht in der zugehörigen Protokolldatei deines Webservers?
    Schließlich: wie sieht denn die Zeile 48 in deinem Script aus?

    Ist IP ein Modul ?

    Nein, zumindest keines, das zum "Standard" gehört (oder ist mir nicht bekannt). Aber du kannst dir ja selber eins mit diesem Namen gebaut haben.

    Oder muß ich noch eine Umgebungsvariable reinladen ?

    Das hängt davon ab, was dein Script tun soll, und wie es das tun soll.

    Grüße aus Berlin

    Christoph S.

    --

    christoph.schnauss@berlin.de
    http://www.christoph-schnauss.de
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Hier mal das gesamte Script,

      der erste Versuch geht ja meist in die "Hose":

      (soll heissen - das ist mein erstes Script in Perl)

      Wenn Jemand mal so nett wäre das Script auf Fehler zu untersuchen:

      (vieles sind auch Kommentare - der eigentliche Code ist nicht so viel)

      #!/usr/bin/perl

      use strict;
      use CGI::Carp qw(fatalsToBrowser);

      #---------------Variablen werden vereinbart-----------------------------------------------------------------------------------

      my $sendmailprog = "/usr/lib/sendmail"; #Das Standard Mail-Prog auf Unix-Rechnern wird aufgerufen.

      my %Daten = (); #Der Hash für die Aufnahme der Daten wird vorbereitet

      #**************Variablenvereinbarung*ist*zu*ende******************************************************************************

      #----------------erste Subroutine zum Aufsplitten der Standardeingabe----------------------------------------------------------

      sub readin()

      {
       my $rohdaten;
       my @Datenroh;
       my $wertname;
       my $value;
       my $temporaer;

      read(STDIN, $rohdaten, $ENV{'QUERY_STRING'}); #Einlesen der Daten
       @Datenroh = split(/&/,$rohdaten); #Aufsplitten des Eingabestrings zu einem Hash

      foreach $temporaer (@Datenroh) #foreach geht den Hash @Daten durch und der aktuelle Wert liegt in $Daten (ansonsten in $_)
        {
        ($wertname, $value) = split(/=/, $temporaer); #Aufsplitten der Datenpaare in Wert und Name - temp dient der temporären Aufnahme der Daten

      $value =~ tr/+/ /; #Da in URL-encoded Leerzeichen mit + codiert werden, muss + durch den Befehl tr rückgewandelt werden
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $value =~ s/<!--(.|\n)*-->//g; #Ersetze die Zeichenfolge '<!--' gefolgt von beliebig vielen beliebigen Zeichen oder beliebig vielen Newline-Zeichen durch nichts."
        $value =~ s/<([^>]|\n)*>//sg; # Ersetze die Zeichenfolge '<!--' gefolgt von beliebigen Zeichen ausser dem groesser-als-Zeichen gefolgt von der Zeichenfolge '-->' durch nichts
        $value =~ s/<!--.*?-->?//sg; # Ersetzt alle HTML Kommentare

      $Daten{$wertname} = $value; #Werte sind am Ende vollständig eingelesen

      }  #For-each ist hier zu ende

      #$Daten{Remote IP} = $ENV{'REMOTE_ADDR'};

      $Daten{Domain IP} = $ENV{'REMOTE_HOST'}; -> Zeile 48 siehe erste

      Antwort

      #$Daten{Protokoll} = $ENV{'REMOTE_IDENT'};
       #$Daten{IP User} = $ENV{'REMOTE_USER'};

      }

      #--------------Ende der ersten Subroutine----------------------------------------------------------------------------------------

      #---------------Subroutine zum versenden der Mail-----------------------------------------------------

      sub send
      {
       open(Sendmail, "| $sendmailprog"); #Die Datei sentmail wird über das Dateihandle Sendmail angesprochen -> man kann dem Unix-Prog sentmail werte übergeben
       select(Sendmail); #Standardein/-ausgabe Kanal wird auf sendmail festgelegt  und damit auf sentmail
       print "From: $Daten{'vorname'} $Daten{'name'} $Daten{'mail'} \n"; #übergibt sentmail die Variablen für den Absender
       print "To: Meine Mailaddi \n"; # Hier wird festgelegt an wen die Mail versendet wird
       print "Reply-To: $Daten{'mail'} \n"; #Wohin kann eine Antwort gesendet werden ?
       print "Subject: Mail über Webserver versendet \n";
       print "$Daten{'eingabe'} \n";
       print "Schule Ja/nein: $Daten{'schule'} \n";
       print "Alter: $Daten{'alter'} \n";
       print "Die Ip des Remote Servers: $Daten{'Remote IP'} \n";
       print "Die Domain des Remote Servers: $Daten{'Domain IP'} \n";
       print "Protokoll - Infos: $Daten{'Protokoll'} \n";
       print "Die IP des Users: $Daten{'IP User'} \n";
       close(Sendmail) || &error('schliessen');
       select(STDOUT);

      }

      #------------Ende der zweiten Subroutine--------------------------------------------------------------

      #------------Subroutine für danke--------------------------------------------------------------------

      sub thanks

      {
       #print "Content-type: text/html\n\n";
       #print "<html><head><title>Danke für ihr Feedback</title>\n";
       #print "</head><body bgcolor="#1540B9">\n";
       #print "<font color="#FFFFFF"><div align="center">Danke für deine Mitteilung</font></div>"
              #print "\n</body></html>";

      }

      #----------Ende der dritten Subroutine----------------------------------------------------------------------

      #°°°°°°°°°°°°°°°°°°°Aufruf derSubtoutinen°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
      &readin;
      &send;
      &thanks;

      1. Hi MoD,

        folgendes würde ich ergänzen bzw. anders machen:

        #!/usr/bin/perl

        #!/usr/bin/perl -w

        use strict;

        use warnings;

        use CGI::Carp qw(fatalsToBrowser);

        use CGI;
        use HTML::Entities;

        sub readin()

        Hier empfiehlt sich imho die Verwendung des CGI-Moduls:
        http://selfhtml.teamone.de/cgiperl/module/cgi.htm#formularverarbeitung

        Weiterhin wäre hier auch möglicherweise die Verwendung von HTML::Entities denkbar:
        http://www.perldoc.com/perl5.8.0/lib/HTML/Entities.html

        #$Daten{Remote IP} = $ENV{'REMOTE_ADDR'};

        $Daten{Domain IP} = $ENV{'REMOTE_HOST'}; -> Zeile 48 siehe erste

        Diese Zeilen waren vermutlich ursprünglich nicht auskommentiert. Das Problem hier sollte sein, dass du als Namen "Remote IP" verwendest, besser wäre "Remote_IP".

        Aufruf derSubtoutinen

        &readin;
        &send;
        &thanks;

        Imho wäre es hier besser, diese Aufrufe zu machen, bevor du die einzelnen Subroutinen definierst. Darüber hinaus wäre es imho besser, die Subroutinen so aufzurufen:

        readin();

        Viele Grüße
        Torsten

        1. use Mosche;

          use HTML::Entities;

          Weiterhin wäre hier auch möglicherweise die Verwendung von HTML::Entities denkbar:

          Wo?

          #$Daten{Remote IP} = $ENV{'REMOTE_ADDR'};

          $Daten{Domain IP} = $ENV{'REMOTE_HOST'}; -> Zeile 48 siehe erste

          Diese Zeilen waren vermutlich ursprünglich nicht auskommentiert. Das Problem hier sollte sein, dass du als Namen "Remote IP" verwendest, besser wäre "Remote_IP".

          Nö. Das Problem ist, dass er seinen String nicht richtig schreibt. $Daten{'Remote IP'} funktioniert.

          Remote IP ruft die Methode Remote() des Packages IP auf.

          Imho wäre es hier besser, diese Aufrufe zu machen, bevor du die einzelnen Subroutinen definierst.

          Individuelle Übersicht. Ich präferiere aber auch Methodenaufrufe oben hin zu machen (solange die Reihenfolge egal ist) und Subroutinen erst am Ende zu deklarieren.

          Darüber hinaus wäre es imho besser, die Subroutinen so aufzurufen:
          readin();

          Außer, man weiss, was man tut.

          use Tschoe qw(Matti);

          --
            Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
          1. Hi Matti,

            use HTML::Entities;
            Weiterhin wäre hier auch möglicherweise die Verwendung von HTML::Entities denkbar:
            Wo?

            Autsch, nicht richtig gelesen. Ich hatte nur gesehen, dass MoD die "<" und ">" ersetzen wollte, da drängte sich mir HTML::Entities auf. Dabei wollte er doch nur die Kommentare entfernen, wofür er dieses Modul selbstverfreilich nicht benötigt.

            $Daten{'Remote IP'} funktioniert. Remote IP ruft die Methode Remote() des Packages IP auf.

            Wieder was gelernt :)

            Viele Grüße
            Torsten

        2. Danke für Eure Antworten,

          hab selber auch noch ein paar Fehler entdeckt.
          (z.B. Hab ich die Standardeingabe falsch eingelesen -> hab die Methode für get verwendet)

          Auf das Leerzeichen wär ich aber nicht gekommen. (jedenfalls nicht so schnell)

          Danke für eure Antworten.

          folgendes würde ich ergänzen bzw. anders machen:

          #!/usr/bin/perl

          #!/usr/bin/perl -w

          use strict;

          use warnings;

          use CGI::Carp qw(fatalsToBrowser);

          Was sind bei den Befehlen die konkreten Unterschiede (eine Doku reicht aus -> wenn Ihr eine Addi habt)

          danke MoD