Olli: Im Fehlerfall mail an mich mit allen Variablen

Hi,
bei bestimmten Eingaben in mein Formular (Perl-Script) wird eine Fehlermeldung an den Anwender gesendet. Ich möchte nun wissen, welches die häufigsten Eingabefehler sind (um mein Programm entsprechend zu verbessern). Wie kann ich die zum Zeitpunkt eines Fehlers bekannten globalen Variablen an meine e-mail-Adresse versenden ?

open(MAIL,"|...... -t");
print MAIL "To: .......o\n";
print MAIL "Subject: Fehlerstatistik\n\n";
print MAIL "??????????????????????????????????????????\n";
close(MAIL);

Danke
Oliver

  1. Hallo,

    open(MAIL,"|...... -t");
    print MAIL "To: .......o\n";
    print MAIL "Subject: Fehlerstatistik\n\n";
    print MAIL "??????????????????????????????????????????\n";
    close(MAIL);

    open(MAIL,"|...... -t");
    print MAIL "To: .......o\n";
    print MAIL "Subject: Fehlerstatistik\n\n";
    foreach(sort(keys(%ENV))) {
      print MAIL "$_ = $ENV{$_}\n";
    }
    close(MAIL);

    Meinst du so etwas?

    MfG Christian

    1. Hallo,
      danke für die schnelle Reaktion - kurz vor dem WM-Spiel.

      Meinst du so etwas:
      foreach(sort(keys(%ENV))) {
        print MAIL "$_ = $ENV{$_}\n";
      }

      Nein, ich meine die Variablen, die in meinem PERL-Programm definiert sind und wenn möglich alle Variablen, die vom Formular des rufenden Programms kamen.

      1. Hallo,

        Nein, ich meine die Variablen, die in meinem PERL-Programm definiert sind und wenn möglich alle Variablen, die vom Formular des rufenden Programms kamen.

        Im Hash %ENV sind ALLE Umgebungsvariablen gespeichert. Wenn du die anderen Variablen an dich schicken lassen willst, gehe nach folgendem Schema vor:

        $var_1 = ...
        $var_2 = ...
        $var_3 = ...
        $var_4 = ...
        $var_5 = ...

        print MAIL "Inhalt der Variablen 1 ist $var_1\n";

        Für genauere Infos müsste ich wissen, wie genau dein Formular aufgebaut ist und funktioniert.

        MfG Christian

        1. Hallo,

          print MAIL "Inhalt der Variablen 1 ist $var_1\n";

          Das wäre zu mühsam.

          Die Definition der Variablen ist über das Script zerstreut und zum Zeitpunkt des Fehlers sind manche schon definiert andere nicht.

          Das Programm def. die Variablen auf zwei Arten:

          use vars qw($vg1 $vg2 ......);
          ....
          my vl1 = "r";
          ....

          $vg1 = param(v1);     # Input-Variable vom rufenden Programm
          ....

          Es gibt doch sicher ein Systemarray/Hash o.ä., in dem die Variablen verzeichnet sind. Wenn man da mit einer Schleife zugreifen könnte ?
          Gruß
          Oliver

          1. Hallo,

            Es gibt doch sicher ein Systemarray/Hash o.ä., in dem die Variablen verzeichnet sind. Wenn man da mit einer Schleife zugreifen könnte ?

            Das wäre sicher praktisch, aber mir wäre solch eine Funktion neu. Da kann ich nicht dann mehr weiterhelfen.

            MfG Christian

            --
            SelfCode: ie:% fl:( br:> va:) ls:} fo:| rl:( n4:~ ss:) de:< js:{ ch:{ mo:} zu:(
          2. Hi,

            Es gibt doch sicher ein Systemarray/Hash o.ä., in dem die Variablen verzeichnet sind. Wenn man da mit einer Schleife zugreifen könnte ?

            http://forum.de.selfhtml.org/archiv/2006/6/t131367/#m849849 könnte Dich interessieren.

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            Schreinerei Waechter
            O o ostern ...
            Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
            1. Hi,

              http://forum.de.selfhtml.org/archiv/2006/6/t131367/#m849849 könnte Dich interessieren.

              Ja das scheint es zu sein, wenn ich es nur verstehen würde ?

              Was bedeutet:
                 Zugriff auf alle Einträge dieser Symboltabelle erhältst du über den
                 Hash '%package_name::'.

              In anderen Worten.Was muss ich zusätzlich zu dem nachfolgenden Statement noch angeben ?

              foreach $wert (keys %main::) {
                print scalar($v);
              }

              Danke für die Hilfe
              Oliver

              1. Hell-O!

                In anderen Worten.Was muss ich zusätzlich zu dem nachfolgenden Statement noch angeben ?
                foreach $wert (keys %main::) {
                  print scalar($v);
                }

                Zunächst muss $v natürlich $wert heißen, was in dem verlinktem Archivthread auch steht. Der Code funktioniert nach Korrektur also wie gewünscht, du musst die Ausgabe nur in deine E-Mail leiten. Allerdings ist das Ganze mit Vorsicht zu genießen, da im Package main nicht nur deine Variablen definiert sind, sondern ein ganzer Sack voll mehr, der dich überhaupt nicht interessieren wird.

                Da wäre es m.E. einfacher, die Variablen einfach nur auszugeben, denn ihr Name ist dir ja bekannt und deklariert sind sie auch.

                Siechfred

                --
                Hier könnte Ihre Werbung stehen.
                Viel Lärm um nichts || Steuerliche Einordnung des Rangrücktritts
                1. Also bei mir scheint der Wurm drin zu sein - bzw. es fehlen mir halt grundlegende Kenntnisse!

                  1. Problem:
                  In mein Script-Gerippe eingebaut sieht es so aus:

                  #!/usr/bin/perl -w
                  use strict;
                  use CGI qw/:standard/;
                  use CGI::Carp qw(fatalsToBrowser);

                  package Test;

                  my $test_var1 = 'foo';
                  my $test_var2 = 'bar';

                  package main;

                  my $wert;
                               print "Content-type: text/html\n\n";

                  foreach $wert (keys %Test::) {
                    print scalar($wert) . ' = ' . ${"Test::$wert"} . "\n";
                  }

                  Da meckert er zurecht $wert an (Global symbol $wert requires ....
                  Wenn ich dies korrigiere kommt die Meldung
                  'Premature end of script headers'.
                  Daraufhin habe ich die print "Content-type...."-Anweisung eingefügt.
                  Da bringt er weder einen Ausdruck noch eine Fehlermeldung.

                  2. Problem
                  Ich habe in meinem Programm keine packages definiert. Ich habe es also folgendermaßen realisiert.

                  #!/usr/bin/perl -w

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

                  use vars qw($t1 $t2);
                  $t1 = 'g1';
                  $t2 = 'g2';

                  my $test_var1 = 'foo';
                  my $test_var2 = 'bar';

                  print "Content-type: text/html\n\n";
                  foreach my $wert (keys %main::) {
                    print scalar($wert) . ' = ' . ${"main::$wert"} . "\n";
                  }

                  Da kommt eine Bildschirmausgabe, die sieht folgendermaßen aus:

                  / = strike = stderr = Apache:: = URL_ENCODED = SIG = fatalsToBrowser = start_multipart_form = put = Cwd:: = _<C:/XAMPP/perl/lib/File/Spec/Unix.pm = C:/XAMPP/perl/lib/File/Spec/Unix.pm code = ilayer = br = acronym = .... den Teil erspar ich euch ....
                  t2 = g2 .......... t1 = g1

                  Soll es so sein ?
                  Vorhanden ist in der Ausgabe t2 = g2 und t1 = g1 aber nicht testVar1/2.

                  1.   
                    #!/usr/bin/perl -w  
                      
                    use strict;  
                    use CGI();  
                    use CGI::Carp qw(fatalsToBrowser);  
                      
                    use vars qw($t1 $t2);  
                    $t1 = 'g1';  
                    $t2 = 'g2';  
                      
                    my $test_var1 = 'foo';  
                    my $test_var2 = 'bar';  
                      
                      
                    print CGI::header();  
                    no strict 'refs';  
                      
                    foreach my $wert (keys %main::) {  
                      printf "%10s = %s<br>\n",  scalar($wert), (${"main::$wert"} || 'undefined');  
                     }  
                    
                    

                    Struppi.

                    --
                    Javascript ist toll (Perl auch!)
                    1. ...

                        
                      Das ist Quatsch, es löst ja nicht dein Problem.  
                      Wie man mit my deklarierte Variabeln auflistet, weiß ich nicht.  
                        
                      Struppi.
                      
                      -- 
                      [Javascript ist toll](http://javascript.jstruebig.de/) (Perl auch!)
                      
                      1. Hell-O!

                        Wie man mit my deklarierte Variabeln auflistet, weiß ich nicht.

                        Lexikalische Variablen werden perlintern nicht in der Symboltabelle eines Packages gespeichert, sondern gesondert verwaltet. Auf diese my-Tabelle hat man aber keinen Zugriff. Das wäre auch ein bisschen zuviel des Guten, denn eine mit my deklarierte Variable kann ja innerhalb eines Scripts in beliebig vielen Gültigkeitsbereichen vorkommen:

                        my $a = 42;  
                        {  
                          my $a = 'foo';  
                          print '$a im Block: ', $a, "\n";  
                        }  
                        print '$a in main: ', $a;
                        

                        Das ergibt erst 'foo' und dann 42. Welchen Wert soll Perl denn nun aber in der Symboltabelle speichern?

                        Siechfred

                        --
                        Hier könnte Ihre Werbung stehen.
                        Viel Lärm um nichts || Steuerliche Einordnung des Rangrücktritts
                        1. Das ergibt erst 'foo' und dann 42. Welchen Wert soll Perl denn nun aber in der Symboltabelle speichern?

                          Er muss doch beide Werte irgendwo haben. Den im Block zumindest solange er im Block ist.

                          Ich habe in meinem jugendlichen Leichtsinn gedacht, wenn ich an einer bestimmten Stelle im Programm eine 'Momentaufnahme' will, so werden die Variablen angezeigt, die zu diesem Zeitpunkt an der Stelle bekannt sind. D.h. wenn der 'DUMP' in dem obigen Block abgesetzt wird, könnte angezeigt werden:

                          main: $a = "42";
                                 ....
                            block1: $a = "foo";    (ganz gleich wie der Block intern bezeichnet wird).
                          Die Information muss dem System ja bekannt sein, denn
                          wenn ich habe
                          my $v="1"; ...
                            {my v1="2";...
                               {my v1="3";...
                                  {my v1="4";.......
                                  }
                               }
                            }
                          und aus dem innersten Block schrittweise in den umfassenden Block zurückkomme hat er ja wieder den Wert dieses übergeordneten Blocks.
                          Die Frage ist wohl nur, wie man es darstellen könnte.
                          Aber das ist wohl Wunschdenken!

                          Mal ne ganz andere Frage:
                          Immer wieder sehe ich als Wertzuweisung 'foo'. Hat dies eine besondere Bedeutung ?
                          Gruß
                          Oliver

                          1. Hell-O!

                            Er muss doch beide Werte irgendwo haben. Den im Block zumindest solange er im Block ist.

                            Wie ich schrieb, Perl hat für lexikalische Variablen eine eigene Verwaltung außerhalb der Symboltabelle. Es gibt keine Möglichkeit, auf diese "my-Tabelle" zuzugreifen.

                            Ich habe in meinem jugendlichen Leichtsinn gedacht, wenn ich an einer bestimmten Stelle im Programm eine 'Momentaufnahme' will, so werden die Variablen angezeigt, die zu diesem Zeitpunkt an der Stelle bekannt sind.

                            Ja, aber mit der Einschränkung, dass sie in der Symboltabelle gespeichert wurden.

                            Immer wieder sehe ich als Wertzuweisung 'foo'. Hat dies eine besondere Bedeutung ?

                            Ja, eine so enorme, dass es dazu ein eigenes RFC gibt: RFC 3092.

                            Siechfred

                            --
                            Hier könnte Ihre Werbung stehen.
                            Viel Lärm um nichts || Steuerliche Einordnung des Rangrücktritts
          3. $vg1 = param(v1);     # Input-Variable vom rufenden Programm
            ....

            Es gibt doch sicher ein Systemarray/Hash o.ä., in dem die Variablen verzeichnet sind. Wenn man da mit einer Schleife zugreifen könnte ?

            Kann es sein, dass du nur die CGI Parameter meinst?

            Die bekommst du alle mit CGI::Dump() (oder in älteren Versionen des CGI Moduls evtl. mit CGI::dump() )

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Hallo,

              Die bekommst du alle mit CGI::Dump() (oder in älteren Versionen des CGI Moduls evtl. mit CGI::dump() )

              CGI::dump() bringt Fehler
              CGI::Dump() wird akzeptiert aber es tut sich nichts (besser gesagt: ich sehe nichts).
              Wohin werden die Daten ausgegeben ?
              Muss ich neben dem CGI::dump()  eine weitere Angabe machen ?

              Verzeihe, aber ich bin kein Perl-Crack!
              Gruß
              Oliver

              1. Wohin werden die Daten ausgegeben ?
                Muss ich neben dem CGI::dump()  eine weitere Angabe machen ?

                ja, print

                Struppi.

                --
                Javascript ist toll (Perl auch!)
                1. Man verzeihe mir meine Hartnäckigkeit, aber ich bin noch Perl-Youngster
                  und brauche etwas genauere Angaben.

                  Habe im Scrip:
                  use CGI;   (bzw. use CGI qw /:standard/;
                  ....
                  print CGI::dump();

                  und dann kommt die Meldung:

                  Undefined subroutine CGI::dump() at ....

                  Bestimmt fehlt noch ein use ...... !?

                  1. Habe im Scrip:
                    use CGI;   (bzw. use CGI qw /:standard/;
                    ....
                    print CGI::dump();

                    und dann kommt die Meldung:

                    Undefined subroutine CGI::dump() at ....

                    Wie gesagt sie heißt CGI::Dump() in älteren Versionen des Moduls heißt sie dump()

                    Struppi.

                    --
                    Javascript ist toll (Perl auch!)
                    1. Ich Depp (Selbsbeleidigung ist hoffentlich erlaubt ?)!
                      Natürlich groß geschrieben - Du hattest es erwähnt. Es wird wohl die Hitze gewesen sein.

                      Jetzt bekomme ich alle Variablen, die mit POST an das Skript übergeben wurden (sind das die environment-Variablen oder heissen die anders ?)
                      Ich möchte aber zusätzlich die im aktuellen Skript def. Variablen

                      use vars qw($v1 $v2 ....);
                      my $lv1;

                      Geht sowas dann auch ?