Bio: AAAARRRgh! Ich will dieses Modul benutzen!!!

Sup!

Ihr muesst mich dringend retten... also... folgendes:

Ich will unbedingt das tolle checkRFC.pm Modul benutzen, aber ich kriege es nicht hin.

Wir haben ein Verzeichnis, in dem liegen unsere ganzen Module, es heisst

/home/dienste/webserver/ZENSIERT.uni-erlangen.de/htdocs/perlmodule

Das sind alles ganz einfache Module mit ganz einfachen subs und ohne irgendwelche trickigen Sachen zum Nachladen, fuer Versionschecks oder objektorientierte Spaesschen.
Einfach sub bla {} und am Ende vom File steht 1;

Die Skripte, die diese Module benutzen liegen in anderen Verzeichnissen unter .../htdocs/anderesverzeichnis.
In diesen anderen Verzeichnissen sind symbolische Links in das perlmodule-Verzeichnis.
In den Skripten steht einfach "use <modulename>" und alles funktioniert.

Nun habe ich die neuester Version des checkRFC.pm aus dem CVS geladen und in das perlmodule-Verzeichnis kopiert und in dem Verzeichnis selbst eine Testskript mit dem Namen test.pl gemacht.

#!/usr/bin/perl

use checkRFC;

$email='ace@muenster.de';

if ( is_email $email ) {print "eMail"} else {print "NoeMail"}

Das funzt aber kein Stueck und meint lapidar:

Can't locate object method "is_email" via package "ace@muenster.de" at ./test.pl line 8.

Tja, und ich habe keine Ahnung was ich machen soll und auch ein Blick in den Klammer- und Objektmethodenwald von einigen Skriptteilen vom Self-Forum hat mich nicht naeher an die Loesung des Problems gebracht, wie man das Modul richtig aufruft.

Und jetzt hoffe ich, dass mich n.d., Cheatah oder irgendein Checker retten werden ;-)

Gruesse,

Bio

  1. hallo
    ich weiss ja nicht, aber das, was noch an perl wissen in meinem hirn ist, sagt mir, dass man nicht so einfach Visual Basic syntax verwenden kann ala "button1.height 15".
    was ich damit ausdrücken will:
    du genie machst (wenn der code hier nicht falsch ist) aus der klasse ace@muenster.de das objekt is_email. probiers mal mit is_email($email);
    das sollt stimmen... (was ich für deine ehre aber nicht hoffe... wobei man ja immer das offensichtliche übersieht...)

    mfg
    Matthias Huttar

    1. Joho,

      ich weiss ja nicht, aber das, was noch an perl wissen in meinem hirn ist, sagt mir, dass
      man nicht so einfach Visual Basic syntax verwenden kann ala "button1.height 15".

      Was hat das mit VB-Syntax zu tun?

      was ich damit ausdrücken will:
      du genie machst (wenn der code hier nicht falsch ist) aus der klasse ace@muenster.de das
      objekt is_email. probiers mal mit is_email($email);

      ??? Was soll das denn heissen?
      Da denk doch nochmal drueber nach.

      das sollt stimmen... (was ich für deine ehre aber nicht hoffe... wobei man ja immer das
      offensichtliche übersieht...)

      Ja: in Perl kann man generell erstmal Klammern um Funktionsargumente weglassen.

      Gruss,
       CK
       http://wwwtech.de

  2. Joho,

    Die Skripte, die diese Module benutzen liegen in anderen Verzeichnissen unter .../htdocs/anderesverzeichnis.
    In diesen anderen Verzeichnissen sind symbolische Links in das perlmodule-Verzeichnis.
    In den Skripten steht einfach "use <modulename>" und alles funktioniert.

    Dafuer gibts @INC ;-)

    #!/usr/bin/perl

    use checkRFC;
    $email='ace@muenster.de';
    if ( is_email $email ) {print "eMail"} else {print "NoeMail"}

    Can't locate object method "is_email" via package "ace@muenster.de" at ./test.pl line 8.

    Mach mal ein print __PACKAGE__,"\n"; - was meint das? Und dann mach mal Klammern um $email.

    Wuerd ich eh generell so handhaben: bei eigenen Funktionen/Modul-Funktionen/etc Klammern
    um die Argumente, bei Perl-Funktionen keine - sieht dann gleich viel besser aus ;-)

    Tja, und ich habe keine Ahnung was ich machen soll und auch ein Blick in den Klammer- und
    Objektmethodenwald von einigen Skriptteilen vom Self-Forum hat mich nicht naeher an die
    Loesung des Problems gebracht, wie man das Modul richtig aufruft.

    Cut and Paste von deinem Script hat bei mir gereich - genau dieselben Gegebenheiten wie von
    dir beschrieben. Welche Perl-Version hast du denn?

    Gruss,
     CK
     http://wwwtech.de

    1. hallo christian!

      jetzt versteh ich dich aber auch nicht mehr

      Mach mal ein print __PACKAGE__,"\n"; - was meint das? Und dann mach mal Klammern um $email.

      probiers mal mit is_email($email);
      ??? Was soll das denn heissen? Da denk doch nochmal drueber nach.

      und jetzt steht da

      Und dann mach mal Klammern um $email.

      hab ich da irgendwas übersehen (ausser dem strichpunkt?) (ok, ich geb zu, das mit den Klassen war jetzt aus C++ hergeleitet, aber ich hätt schwören können dass man in perl die objekte aus klassen eben so erstellt wie in C++...)

      mfg Matthias Huttar

    2. Joho,

      Sup!

      Cut and Paste von deinem Script hat bei mir gereich - genau dieselben Gegebenheiten wie von
      dir beschrieben. Welche Perl-Version hast du denn?

      Den seinen gibt's der Herr im Schlaf... nur mir offensichtlich nicht ;-)

      Ach ja: 5.005_03

      Gruesse,

      Bio

  3. Moin Bio,

    #!/usr/bin/perl

    #!/usr/bin/perl -w
    use strict;

    use checkRFC;

    ^ C

    Can't locate object method "is_email" via package "ace@muenster.de" at ./test.pl line 8.

    beschwert er sich eigentlich nur mit -w (oder strict?), dass er das Modul nicht laden kann?

    Viele Gruesse,

    n.d.p.

    1. Sup!

      Im Moment sieht das Skript so aus:

      #!/usr/bin/perl -w
      use strict;

      use lib "/home/dienste/webserver/ZENSIERT.uni-erlangen.de/htdocs/perl

      use CheckRFC;

      print __PACKAGE__,"\n";
      $email='ace@muenster.de';

      if ( is_email $email ) {print "eMail"} else {print "NoeMail"}

      ---

      Das Perlmodul heisst auch genau CheckRFC.pm und es passt soweit alles.
      Mit und ohne das "use lib" meint Perl jetzt:

      Global symbol "$email" requires explicit package name at ./test.pl line 8.
      Execution of ./test.pl aborted due to compilation errors.

      ---

      Ist das strict eigentlich zwingend noetig? Wir gebrauchen da ein paar dreckige Tricks hin und wieder... ich weiss nicht, ob da strict so gut kommt.

      Z.B. machen wir manchmal dieses:

      foreach $element (keys(%g_v_cgi))
      {${$element} = $g_v_cgi{$element};}

      (%g_v_cgi ist dabei ein Hash, in den ein anderer Programmteil die CGI-Variablen reingeschrieben hat, die per GET/POST angekommen sind.)

      ...um eine PHP-aehnliche Variablen-Vorbelegung gemaess den uebergebenen Form-Element-Namen zu bekommen.
      Oder kann man das auch "strict-compliant" machen? Die Variablen kann man ja nicht vordefinieren, die Namen sind ja erst zur Laufzeit bekannt. Oder geht das auch mit "strict"?

      Gruesse,

      Bio

      1. Moin Bio,

        #!/usr/bin/perl -w
        use strict;

        use lib "/home/dienste/webserver/ZENSIERT.uni-erlangen.de/htdocs/perl

        use CheckRFC;

        print __PACKAGE__,"\n";
        $email='ace@muenster.de';

        Global symbol "$email" requires explicit package name at ./test.pl line 8.

        my $email = ...
        oder $main::email = ...

        oder use vars qw($email); irgendwo

        ab perl 5.6:
        our $email =  ...

        Ist das strict eigentlich zwingend noetig?

        noe, aber es macht das Leben wirklich leichter. Einige Fehler passieren so gar nicht erst.

        Wir gebrauchen da ein paar dreckige Tricks hin und wieder... ich weiss nicht, ob da strict so gut kommt.

        wenn ihr die wirklich braucht (manchmal ist das tatsaechlich so), koennt ihr strict local auch ausschalten (no strict;)

        Z.B. machen wir manchmal dieses:

        [...]

        Oder kann man das auch "strict-compliant" machen? Die Variablen kann man ja nicht vordefinieren, die Namen sind ja erst zur Laufzeit bekannt. Oder geht das auch mit "strict"?

        oehm <fg>perldoc CGI</fg> (such dort mal nachimport_names) - aber wer braucht das? *gg*

        Viele Gruesse,

        n.d.p.

        1. Sup!

          Jetzt habe ich mich doch in der Tat mit dem strict reingelegt... GNGNGN!

          Immerhin funzt es jetzt wundersamerweise.

          Danke, danke. Lang lebe PERL!

          Gruesse,

          Bio

          1. Moin nochmal ;)

            Immerhin funzt es jetzt wundersamerweise.

            jo, ich erklaer vielleicht mal, wieso vorhin nicht:

            du hast das Modul als checkRFC.pm gespeichert und mit

            use checkRFC;

            eingebunden, was nichts anderes heisst (perldoc -f use):

            BEGIN {
              require checkRFC;
              checkRFC -> import;
            }

            das 'require' hat noch funktioniert, da die Datei so hiess.
            der Import allerdings nicht mehr! Da das package CheckRFC heisst und Perl casesensitive ist.

            HTH &

            Viele Gruesse,

            n.d.p.

            1. Sup!

              Der Teufel steckt im Detail... einer meiner Kollegen hier, der noch schlechter ist als ich (*buhuhu... ich bin sooo schlecht*) hat 8 Stunden lang eine Funktion debuggt, bis er gemerkt hat, daß es keine gute Idee war, sub als "Sub" zu schreiben ;-)

              Woher weiss man eigentlich immer, in welchem Modul die ganzen Funktionen schon jemand programmiert hat, die man sich selbst ausdenkt, nur um nachher festzustellen, daß es sie "in besser" schon gibt?

              Gruesse,

              Bio

              1. Hallo,

                Woher weiss man eigentlich immer, in welchem Modul die ganzen Funktionen schon jemand programmiert hat, die man sich selbst ausdenkt, nur um nachher festzustellen, daß es sie "in besser" schon gibt?

                Durch geeignete Suche im CPAN und schmöckern der Dokumentationen gefundener Module.

                Gruß Kai

                1. Hallo,

                  Woher weiss man eigentlich immer, in welchem Modul die ganzen Funktionen schon jemand programmiert hat, die man sich selbst ausdenkt, nur um nachher festzustellen, daß es sie "in besser" schon gibt?

                  Durch geeignete Suche im CPAN und schmöckern der Dokumentationen gefundener Module.

                  Was, glaube ich, mehr als abendfüllend ist:-)

                  Grüße
                    Klaus

            2. hi!

              [...]
              der Import allerdings nicht mehr! Da das package CheckRFC heisst
              und Perl casesensitive ist.

              ...was du ihm übrigens schon das letzte Mal als Bio gefragt hat
              erklärt hast... ;)

              bye, Frank!

      2. Hallo,

        Im Moment sieht das Skript so aus:

        #!/usr/bin/perl -w
        use strict;

        [...]

        $email='ace@muenster.de';

        [...]

        Global symbol "$email" requires explicit package name at ./test.pl line 8.
        Execution of ./test.pl aborted due to compilation errors.

        Das hat nichts mit dem vorherigen Problem zu tun, sondern ist ein Feature von use strict;

        %perldoc strict
           This generates a compile-time error if you access a variable that
           wasn't declared via "our" or use vars', localized via my()', or
           wasn't fully qualified.

        Ist das strict eigentlich zwingend noetig?

        Es ist empfehlenswert.

        Wir gebrauchen da ein paar dreckige Tricks hin und wieder... ich weiss nicht, ob da strict so gut kommt.

        Nein, sicher nicht.

        Z.B. machen wir manchmal dieses:

        foreach $element (keys(%g_v_cgi))
        {${$element} = $g_v_cgi{$element};}

        Wobei der Gebrauch von symbolischen Referenzen hier völlig sinnlos (im wahren Sinn des Wortes) ist, da man die Elemente des Hashes gleich direkt verwenden kann.

        Gruß Kai

        1. Sup!

          foreach $element (keys(%g_v_cgi))
          {${$element} = $g_v_cgi{$element};}

          Wobei der Gebrauch von symbolischen Referenzen hier völlig sinnlos (im wahren Sinn des Wortes) ist, da man die Elemente des Hashes gleich direkt verwenden kann.

          Sicher sicher, aber es vermindert den Schreibaufwand und erhoeht zumindest subjektiv die Uebersicht.

          Gruesse,

          Bio

  4. Hallo,

    #!/usr/bin/perl
    use checkRFC;

    $email='ace@muenster.de';
    if ( is_email $email ) {print "eMail"} else {print "NoeMail"}

    Das funzt aber kein Stueck und meint lapidar:

    Can't locate object method "is_email" via package "ace@muenster.de" at ./test.pl line 8.

    Ohne checkRFC zu kennen, scheint checkRFC die sub 'is_email' nicht zu exportieren.

    Perl meint daraufhin, Du rufst hier die Methode 'is_email' der Klasse 'ace@muenster.de' auf.

    Da diese Klasse aber nicht existiert kommt es zu obiger Fehlermeldung.

    Was Du möchtest ist wahrscheinlich:

    use checkRFC 'is_email'; (falls in @EXPORT_OK) folgend wie oben

    oder

    if (checkRFC::is_email($email)) { ... }

    bzw. OO

    if (checkRFC->new->is_email($email)) { ... };

    Gruß Kai