Patrick Andrieu: Warnungen bei Config::IniFiles und noch 'ne Frage

Hallo Perlhacker!

1. Config::IniFiles

Ich experimentiere ein bisschen mit genanntem Modul und beobachte dabei folgendes:
   Inhalt File »ini.ini«:
   [age]
   of_captain = 42
   #eof

Testcase 1 (Config::IniFiles direkt im Perl-Skript):

  
   #!/usr/bin/perl -w  
  
   use strict;  
   use CGI qw(header);  
   use Config::IniFiles;  
  
   my $ini = '/pfad/zu/meiner/datei/ini.ini';  
   my $cfg = new Config::IniFiles(-file => $ini);  
   my $age = $cfg->val('age','of_captain');  
  
   print header();  
   print $age;  

Ausgabe: 42, Error-Log bleibt leer.

Testcase 2 (Config::IniFiles wird in einem weiteren Modul eingebunden):

  
   #!/usr/bin/perl -w  
  
   use strict;  
   use CGI qw(header);  
   use Test::Modul;  
  
   my $age = new Test::Modul;  
   print header();  
   print $age->age;  

Test/Modul:pm

  
   package Test::Modul;  
  
   use strict;  
   use Config::IniFiles;  
  
   my $ini = '/pfad/zu/meiner/datei/ini.ini';  
   my $cfg = new Config::IniFiles(-file => $ini);  
  
   my $age = $cfg->val('age','of_captain');  
  
   ## object constructor  
   sub new {  
     my $pkg = shift;  
     my $modul = bless {  }, $pkg;  
     return $modul;  
   }  
  
   sub age {  
     return $age;  
   }  
   1;  

Ausgabe: 42, Error-Log enthält: [Wed Feb 18 11:33:25 2009] Symbol.pm: Name "Config::IniFiles::/pfad/zu/meiner/datei/ini.ini" used only once: possible typo at C:/Perl/lib/Symbol.pm line 135.

Fragen: Warum? Wie kann ich die Warnung vermeiden?

2. Vergessen wir jetzt Config::IniFiles und die Warnung und ändern Testcase 2 wie folgt:

  
   my $age = new Test::Modul;  
   my $test = "age";  
   print header();  
   print $age->$test;  

Ausgabe: 42

Ich war überrascht, dass es geht. Das wäre für ein Skript, an das ich arbeite, praktisch.
   Aber: Übersehe ich dabei irgendeine Falle, in die ich mit solchen Methodenaufrufen
   tappen könnte? Das funzt™ nämlich auch mit Methoden, die Parameter erwarten:

  
   my $other = new Anderes::Modul;  
   my $test = "name_der_methode_die_einen_parameter_will";  
   print header();  
   print $other->$test('parameter');  

Viele Grüße aus Frankfurt/Main,
Patrick

--
_ - jenseits vom delirium - _

   Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
  1. Ausgabe: 42, Error-Log enthält: [Wed Feb 18 11:33:25 2009] Symbol.pm: Name "Config::IniFiles::/pfad/zu/meiner/datei/ini.ini" used only once: possible typo at C:/Perl/lib/Symbol.pm line 135.

    Fragen: Warum? Wie kann ich die Warnung vermeiden?

    Die Warnung kann ich nicht nachvollziehen. Bei mir kommt nur 42.

    1. Vergessen wir jetzt Config::IniFiles und die Warnung und ändern Testcase 2 wie folgt:

    my $age = new Test::Modul;
       my $test = "age";
       print header();
       print $age->$test;

    
    >    Ausgabe: 42  
    >   
    >    Ich war überrascht, dass es geht. Das wäre für ein Skript, an das ich arbeite, praktisch.  
    >    Aber: Übersehe ich dabei irgendeine Falle, in die ich mit solchen Methodenaufrufen  
    >    tappen könnte? Das funzt™ nämlich auch mit Methoden, die Parameter erwarten:  
      
    Ausser das du prüfen solltest, ob die Funktion exsitiert, wüßte ich keine Falle.  
      
    Struppi.
    
    1. Hallo Struppi!

      Die Warnung kann ich nicht nachvollziehen. Bei mir kommt nur 42.

      Kein Eintrag in der Error-Log? Ich muss dazu sagen, dass ich derzeit mit dem Xitami teste, der schreibt alle Fehler und Warunungen in eine Datei C:\Xitami\cgierr.log.

      Die Warnung wird ja von Symbol.pm verursacht, das ja von Config::IniFiles (Version 2.47, vor wenigen Tagen frisch mittels PPM installiert) eingebunden wird (Zeile 10: use Symbol 'gensym', 'qualify_to_ref'; # For the 'any data type' hack).

      Symbol.pm Zeile 135:

      134: sub qualify_to_ref ($;$) {
      135:       return \*{ qualify $_[0], @_ > 1 ? $_[1] : caller };
      136: }

      Bei 1&1 kann ich nicht testen, weil ich keinen Zugriff auf die Error-Log habe, und Xampp ist auf meinem Uralt-Laptop, den zu starten ich keine Lust hatte ;)

      Ausser das du prüfen solltest, ob die Funktion exsitiert, wüßte ich keine Falle.

      OK, danke.

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --
      _ - jenseits vom delirium - _

         Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
      1. » Die Warnung kann ich nicht nachvollziehen. Bei mir kommt nur 42.

        Kein Eintrag in der Error-Log? Ich muss dazu sagen, dass ich derzeit mit dem Xitami teste, der schreibt alle Fehler und Warunungen in eine Datei C:\Xitami\cgierr.log.

        Ich teste Perlskripte immer im DOS Fenster, warum sollte ich einen Server in diesem Fall dafür benutzen?

        Struppi.

        1. Hallo Struppi!

          Ich teste Perlskripte immer im DOS Fenster

          Ich normalerweise auch, doch das, was ich gerade mache, wird an den Browser ausgelierfert, also nutze ich meine Testumgebung. Und da ist mir die Warnung aufgefallen.

          warum sollte ich einen Server in diesem Fall dafür benutzen?

          Um zu schauen, ob Du auch solch eine Warnung erhälst? ;)

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --
          _ - jenseits vom delirium - _

             Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
          1. Désolé,

            ich kann das auch nicht nachvollziehen, lieber Patrick und schieb das mal auf Deinen Xitami-Server: der xickt.

            Hotte

            --
            Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
            1. Hallo hotti!

              und schieb das mal auf Deinen Xitami-Server: der xickt.

              Sieht so aus... ;)

              Viele Grüße aus Frankfurt/Main,
              Patrick -> Wetterstation geicht ;)

              --
              _ - jenseits vom delirium - _

                 Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
              J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
              1. hi Patrick,

                falls Du ini-Dateien nur lesen willst, siehe kleines Perl-Script.

                Hotte

                =schnipp

                  
                #!/usr/bin/perl -w  
                ###########################################################################  
                # ini-Datei auf einen hash lesen  
                ###########################################################################  
                use strict;  
                  
                my $ref = readini(*DATA);  
                  
                print $$ref{windows}{drucker}, "\n";  
                print $$ref{unix}{drucker}, "\n";  
                print $$ref{windows}{perl}, "\n";  
                print $$ref{unix}{perl}, "\n";  
                  
                exit;  
                ###########################################################################  
                sub readini{  
                	my $fh = shift;  
                  
                	my %data;  
                	my $idx;  
                  
                	while (my $in = <$fh>){  
                		chomp $in;  
                		if ($in =~ /^\[(.*?)\]/) {  
                			$idx = $1;  
                		}  
                		if ($in =~ /^(.*?)=(.*?)$/){  
                			$data{$idx}{$1} = $2;  
                		}  
                	}	  
                	return \%data;  
                }  
                  
                ###########################################################################  
                __END__  
                [windows]  
                drucker=willi  
                perl=c:/perl/bin/perl.exe  
                  
                [unix]  
                drucker=pauli  
                perl=/usr/bin/perl  
                
                
                1. Hoi Hotte.

                  Schreibst Du Dir sämtliche Routinen selbst oder verwendest Du manchmal auch Standardbibliotheken? ;-)

                  Grüße

                  1. hehe;)

                    Schreibst Du Dir sämtliche Routinen selbst oder verwendest Du manchmal auch Standardbibliotheken? ;-)

                    Sofern Standardbibliotheken verfügbar sind, gerne.

                    Config::IniFiles ist keine Standardbibliothek.
                    Und meine Funktion ist sogar einen Tick <durchgestrichen>schneller</durchgestrichen> performanter als das Modul.

                    Hotte

                    --
                    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
          2. » Ich teste Perlskripte immer im DOS Fenster

            Ich normalerweise auch, doch das, was ich gerade mache, wird an den Browser ausgelierfert, also nutze ich meine Testumgebung. Und da ist mir die Warnung aufgefallen.

            einfacher ist es in dem Fall, den von Dirk beschriebenen Weg zu gehen.

            » warum sollte ich einen Server in diesem Fall dafür benutzen?

            Um zu schauen, ob Du auch solch eine Warnung erhälst? ;)

            Naja, die Warnungen kommen ja vom Skript, nicht vom Server.

            Struppi.

            1. Hallo Struppi!

              einfacher ist es in dem Fall, den von Dirk beschriebenen Weg zu gehen.

              Habe ich jetzt auch gemacht (Danke Dirk, das kannte ich zwar, benutze allerdings selten). Ich habe jetzt auch den alten Schleppi samt Apache gestartet, erntete zunächst einen Fatal Error (weil auf dem Schleppi Config::IniFiles nicht installiert war - wie übrigens auch auf 1&1) ;)

              PPM hat mir dort (Perl 5.8.7) eine ältere Version von Config::IniFiles installiert (2.38). Macht nix, ich habe die neuere vom Hauptrechner kopiert und mit beiden Versionen getestet:

              Keine Warnung...

              Auf 1&1 Config::IniFiles, Skript, Modul und ini-File kopiert: keine Warnung...

              Naja, die Warnungen kommen ja vom Skript, nicht vom Server.

              Hm, nur auf dem Xitami kommt die Warnung ;)

              Viele Grüße aus Frankfurt/Main,
              Patrick, gespannt, wann der alte Schleppi in Rauch aufgeht ;)

              --
              _ - jenseits vom delirium - _

                 Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
              J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
            2. Re Struppi!

              Naja, die Warnungen kommen ja vom Skript, nicht vom Server.

              Oder von der Perl-Version?

              Auf dem Rechner mit dem Xitami ist 5.10.0, auf den anderen 5.8.7 respektive 5.8.8

              Viele Grüße aus Frankfurt/Main,
              Patrick

              --
              _ - jenseits vom delirium - _

                 Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
              J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
              1. » Naja, die Warnungen kommen ja vom Skript, nicht vom Server.

                Oder von der Perl-Version?

                Ich benutzt Config::IniFiles schon lange und hab diese Warnung noch nie gesehen.

                Die einzige Möglichkeit die ich sehe, ist das du use warnigns statt dem -w switch verwendest. Was Andere auch bevorzugen http://board.perl-community.de/thread/13129/startWithMessage=6

                Struppi.

                1. Hallo Struppi!

                  »» Oder von der Perl-Version?

                  Doch nicht, habe es jetzt auch auf der Konsole getestet. Die Meldung kommt nur mit dem Xitami.

                  Die einzige Möglichkeit die ich sehe, ist das du use warnigns statt dem -w switch verwendest.

                  Im Gegenteil. Mit dem -w Switch kommt die Warnung, mit use warnings nicht (und ganz ohne nix auch nicht, was ja normal ist)...

                  Das würde eher zu dem von Dir verlinkten Beitrag passen.

                  Viele Grüße aus Frankfurt/Main,
                  Patrick

                  --
                  _ - jenseits vom delirium - _

                     Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                  J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
                  1. » Die einzige Möglichkeit die ich sehe, ist das du use warnigns statt dem -w switch verwendest.

                    Im Gegenteil. Mit dem -w Switch kommt die Warnung, mit use warnings nicht (und ganz ohne nix auch nicht, was ja normal ist)...

                    Das würde eher zu dem von Dir verlinkten Beitrag passen.

                    Naja, ich meinte auch, dass du die Warnungen unterdrücken kannst, wenn du diese nicht auf das Modul beziehst. Aber komisch ist das schon, weil wie gesagt ich bisher nie Probleme hatte und immer -w benutze.

                    Struppi.

      2. Moinmoin!

        Bei 1&1 kann ich nicht testen, weil ich keinen Zugriff auf die Error-Log habe, ...

        http://perldoc.perl.org/CGI/Carp.html
        <schnipp>
        "It is now also possible to make non-fatal errors appear as HTML comments embedded in the output of your program. To enable this feature, "
        ...
        use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
        use CGI qw(:standard);
        print header();
        warningsToBrowser(1);
        </schnipp>

        Grüße

  2. Hi,

    Ausgabe: 42, Error-Log enthält: [Wed Feb 18 11:33:25 2009] Symbol.pm: Name "Config::IniFiles::/pfad/zu/meiner/datei/ini.ini" used only once: possible typo at C:/Perl/lib/Symbol.pm line 135.

    Fragen: Warum? Wie kann ich die Warnung vermeiden?

    Ein FileHandle wird aufgemacht, aber nicht geschlossen. Das Problem ist nachvollziehbar:

    my $file = 'basic.ini';
    open IN, $file;

    =>

    Name "main::IN" used only once: possible typo at F:.....

    Hotte

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. »    Fragen: Warum? Wie kann ich die Warnung vermeiden?

      Ein FileHandle wird aufgemacht, aber nicht geschlossen. Das Problem ist nachvollziehbar:

      Nein, das ist falsch.
      Die Warnung kommt aus In Symbol.pm

      sub qualify_to_ref ($;$) {  
       	return \*{ qualify $_[0], @_ > 1 ? $_[1] : caller };  
      }  
      
      

      Allerdings verstehe ich nicht, warum bei Patrick hier eine Warnung erzeugt wird und bei mir nicht.

      Struppi.