Barnabas: Alte Werte bei Programmneustart

Hallo,
ich brauche Eure Hilfe!
in meinem CGI-Perlprogramm habe ich zu Beginn eine Variable definiert mit
my $count;
Dann kommen Unterroutinen unter anderem eine ("up1"), die $count um 1 hochzählt.
Danach
use cgi;
...
$count=0;
...
up1;  (5 mal aufgerufen)
.....
Und jetzt das Problem:
Ich rufe das Programm auf und es zählt hoch bis 5.
Wenn ich das Programm erneut starte (z.B. Refresh der Seite oder gleiche Url eingeben), zählt das Programm weiter mit 6, 7 ....

Warum wird die Initialisierung ($count=0;)da nicht mehr aufgerufen?

  1. Warum wird die Initialisierung ($count=0;)da nicht mehr aufgerufen?

    Keine Ahnung - das ergibt sich nicht aus deiner Beschreibung.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
  2. moin,

    Ich rufe das Programm auf und es zählt hoch bis 5.
    Wenn ich das Programm erneut starte (z.B. Refresh der Seite oder gleiche Url eingeben), zählt das Programm weiter mit 6, 7 ....

    Kann ich das Script mal sehen?

    --Klug

    1. Kann ich das Script mal sehen?

      Ich habe mühsam das lange Skript abgespeckt, ohne dass der Effekt verlorenging.
      In Zeile 40 des nachfolgenden Skripts erfolgt die Initialisierung $sendeURL = http://www.foo_speziell.com/.
      In Zeile 31 wird der neue Wert http://www.foo_standard.com/myinclib/ zugewiesen, da http://www.foo_speziell.com/dir.inc nicht vorhanden ist
      Wenn jetzt das Perl-Programm erneut aufgerufen wird (z.B. durch refresh),
      so bleibt der Wert $sendeURL = http://www.foo_standard.com/myinclib/,
      d.h.  die Initialisierung in Zeile 40 erfolgt nicht mehr.
      Warum?

        
      #!/usr/bin/perl -w  
      use strict;  
      use LWP::UserAgent;  
      my  ($query, $error_nr, $sendeURL, $myincURL, $url, $ua);  
      sub getinc  
         {$url = $sendeURL . $_[0] . ".inc";  
          my $ua = LWP::UserAgent->new();  
          my $req = HTTP::Request->new("GET" => $url);  
          my $res = $ua->request($req);  
          my $seite = $res->content();  
          if ( $res->is_success() )  
            {  
             print $seite;  
            }  
          else  
      # wenn dir.inc in http://www.foo_speziell.com nicht vorhanden, dann auch alle nachfolgenden *.inc in http://www.foo_standard.com/myinclib/ lesen  
            {  
             $url = $myincURL . $_[0] . ".inc";  
             $req = HTTP::Request->new("GET" => $url);  
             $res = $ua->request($req);  
             $seite = $res->content();  
             if ( $res->is_success() )  
               {  
                print $seite;  
               }  
             else  
               {  
                print "<h1 align='center' style='margin-top:4em;color:red;'>Fehler: Modul $_[0] nicht gefunden<\/h1>" ;  
               }  
             if ($_[0] eq "dir")  
               {  
                $sendeURL = "http://www.foo_standard.com/myinclib/";         # <===== Änderung $sendeURL  
               }  
            }  
         }  
        
      use CGI;  
      use CGI::Carp qw(fatalsToBrowser);  
      print "Content-type: text/html\n\n";  
      $query = new CGI;  
      $sendeURL = "http://www.foo_speziell.com/";                                # <===== Initialisierung $sendeURL  
      $myincURL = "http://www.foo_standard.com/myinclib/";  
        
      print <<AAA;  
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
      <html>  
      <head>  
      </head>  
      <body>  
      AAA  
        
      getinc ("dir");  
      getinc ("header");  
      getinc ("kopf");  
      getinc ("index/inhalt");  
        
      print <<GGG;  
      </div>  
      </body>  
      </html>  
      GGG  
        
      # End of Text  
      
      
      1. Ich habe mühsam das lange Skript abgespeckt, ohne dass der Effekt verlorenging.

        ich verstehe immer noch nicht wo dein Problem ist. Kannst du es soweit reduzieren, dass man das richtig testen kann?

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. ich verstehe immer noch nicht wo dein Problem ist. Kannst du es soweit reduzieren, dass man das richtig testen kann?

          Voilà:

            
          #!/usr/bin/perl -w  
          use strict;  
          use LWP::UserAgent;  
          my  ($zahl);  
          sub getinc  
             {print "*** \$zahl: $zahl ***<br>";  
             $zahl= $zahl+1;}  
          use CGI;  
          use CGI::Carp qw(fatalsToBrowser);  
          print "Content-type: text/html\n\n";  
                                                              $zahl = 1;  
          print <<AAA;  
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
          <html><head></head><body>  
          AAA  
          getinc ();  
          print <<GGG;  
          </div>  
          </body>  
          </html>  
          GGG  
          
          

          Wenn ich es starte, wird wie erwartet 1 angezeigt. Dann wird es hochgezählt. Wenn ich jetzt refresh drücke oder auch die URL neu eingebe, zeigt er 2 bzw. 3, 4,.... an.
          Ich hätte erwartet, dass beim erneuten Aufruf des Programms wieder in Zeile 11 die Initialisierung auf 1 stattfindet.
          Gruß
          Barnabas

          1. Wenn ich es starte, wird wie erwartet 1 angezeigt. Dann wird es hochgezählt. Wenn ich jetzt refresh drücke oder auch die URL neu eingebe, zeigt er 2 bzw. 3, 4,.... an.

            Wen ich das Skript starte bekommt ich immer eine 1 angezeigt, wie erwartet. Wie hier zu sehen: http://jstruebig.de/cgi-bin/test1.pl

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Wenn ich es starte, wird wie erwartet 1 angezeigt. Dann wird es hochgezählt. Wenn ich jetzt refresh drücke oder auch die URL neu eingebe, zeigt er 2 bzw. 3, 4,.... an.

              Wen ich das Skript starte bekommt ich immer eine 1 angezeigt, wie erwartet. Wie hier zu sehen: http://jstruebig.de/cgi-bin/test1.pl

              Jetzt wird es immer seltsamer:
              Wenn ich es im Internet teste, dann läuft es auch wie erwartet.
              Dann muss es wohl an Installationsparametern liegen. Aber da bin ich wirklich am Ende meiner Weisheit.
              Hoffentlich nicht Di/Ihr?
              Gruß
              Barnabas

              1. Hi,

                Wenn ich es im Internet teste, dann läuft es auch wie erwartet.
                Dann muss es wohl an Installationsparametern liegen. Aber da bin ich wirklich am Ende meiner Weisheit.

                Ist Perl bei Dir lokal per mod_perl in den Apache integriert, während es beim Provider über die CGI-Schnittstelle bedient wird?

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                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. Ist Perl bei Dir lokal per mod_perl in den Apache integriert, während es beim Provider über die CGI-Schnittstelle bedient wird?

                  Ja
                  Gruß
                  Barnabas

                  1. Ist Perl bei Dir lokal per mod_perl in den Apache integriert, während es beim Provider über die CGI-Schnittstelle bedient wird?
                    Ja

                    Suchstichworte: mod_perl und Data-Sharing.

                    Siechfred

                    --
                    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
                    1. Suchstichworte: mod_perl und Data-Sharing.

                      Immer mehr verkommt SELFHTML zu einem Forum, indem verwiesen wird, wie man etwas finden kann.
                      Diejenigen vergessen, dass ein Fragender meist nicht das Allroundwissen hat, um das zu verstehen. Und er hat auch nicht die Zeit und das Wissen, um sich in alle Spezialthemen einarbeiten.
                      Für mich z.B. dient der lokale Apache-Server zum Test meiner Programme, damit ich nicht direkt im Internet testen muss.
                      Es lag nahe etwas zu installieren, was ohne große Fachkenntnisse möglich ist.
                      Der XAMPP/Apache-Server stellt also für mich genauso so eine Black Box dar, wie der Server, auf dem meine Programme im Internet laufen.
                      Ich verstehe den Hinweis 'Hilfe zur Selbsthilfe', aber irgendwo sind Grenzen.
                      Als Anwendungsentwickler in größeren Unternehmen hat man auch Hilfe durch Spezialisten für viele einzelne Gebiete, die einem weiterhelfen und nicht auf Spezialliteratur hinweisen.
                      Im konkreten Fall ist mir nicht einmal klar was das Data-Sharing bedeutet. Mehrere Anwendungen teilen sich eine Ressource? Ich habe doch nur eine Anwendung am Laufen?

                      Vielleicht könnt Ihr mir schreiben, ob das mod_perl so zu parametrisieren ist, dass es wie die Internet-Variante läuft oder ob es ein einfach zu installierendes Perl gibt, das sich wie die Internet-Version (CGI-Schnittstelle).
                      Danke Euch

                      1. Immer mehr verkommt SELFHTML zu einem Forum, indem verwiesen wird, wie man etwas finden kann.

                        Bringe dich ein und ändere, was dir nicht passt.

                        Diejenigen vergessen, dass ein Fragender meist nicht das Allroundwissen hat, um das zu verstehen. Und er hat auch nicht die Zeit und das Wissen, um sich in alle Spezialthemen einarbeiten.

                        Ich halte mod_perl für weniger alltäglich als eine "normales" Perl. Ich habe dir den Tipp gegeben, den ich für zielführend halte, Data-Sharing ist eines der wesentlichen Merkmale von mod_perl.

                        Für mich z.B. dient der lokale Apache-Server zum Test meiner Programme, damit ich nicht direkt im Internet testen muss. Es lag nahe etwas zu installieren, was ohne große Fachkenntnisse möglich ist.

                        Und warum nimmst du dann mod_perl? So etwas lokal zu installieren ist nur dann sinnvoll, wenn du auf deinem Internetserver damit zurechtkommen musst (identische Produktiv- und Testumgebung) oder wenn du damit herumexperimentieren willst, um es kennenzulernen.

                        Ich verstehe den Hinweis 'Hilfe zur Selbsthilfe', aber irgendwo sind Grenzen.

                        Ja, in der Tat ist deine Reaktion grenzwertig. Aber es findet sich sicher noch jemand, der dir hilft, ich jedenfalls habe darauf keinen Bock mehr.

                        Siechfred

                        --
                        Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
                        1. Bringe dich ein und ändere, was dir nicht passt.

                          Wenn du meinen Beitrag aufmerksam liest, kannst Du erkennen, dass ich mich (noch) nicht einbringen kann - zumindest nicht mit schlauen Antworten.

                          Ich halte mod_perl für weniger alltäglich als eine "normales" Perl. Ich habe dir den Tipp gegeben, den ich für zielführend halte, Data-Sharing ist eines der wesentlichen Merkmale von mod_perl.

                          Was ich aus den data sharing verstnden habe ist, dass man mit zusätzlichen statements das System dazu bringen kann, die Werte aus dem Cash zu lesen. Das habe ich allerdings nicht gemacht.

                          Für mich z.B. dient der lokale Apache-Server zum Test meiner Programme, damit ich nicht direkt im Internet testen muss. Es lag nahe etwas zu installieren, was ohne große Fachkenntnisse möglich ist.

                          Ja, in der Tat ist deine Reaktion grenzwertig. Aber es findet sich sicher noch jemand, der dir hilft, ich jedenfalls habe darauf keinen Bock mehr.

                          Und jetzt warte ich bis Mama mich aus der Schmollecke herausholt!

                      2. Im konkreten Fall ist mir nicht einmal klar was das Data-Sharing bedeutet. Mehrere Anwendungen teilen sich eine Ressource? Ich habe doch nur eine Anwendung am Laufen?

                        Ich kenn mich mit mod_perl auch nicht aus, aber hast du es mal mit google probiert?

                        Vielleicht könnt Ihr mir schreiben, ob das mod_perl so zu parametrisieren ist, dass es wie die Internet-Variante läuft oder ob es ein einfach zu installierendes Perl gibt, das sich wie die Internet-Version (CGI-Schnittstelle).

                        Das hat nichts mit Perl zu tun, du hast deinen Server evtl. so konfiguriert, dass er Perl als mod_per startet. Du Glücklicher, ich hab das bei mir lokal noch nicht geschafft. Daher kann ich dir auch nicht weiterhelfen.

                        Struppi.

                        --
                        Javascript ist toll (Perl auch!)
                        1. Das hat nichts mit Perl zu tun, du hast deinen Server evtl. so konfiguriert, dass er Perl als mod_per startet. Du Glücklicher, ich hab das bei mir lokal noch nicht geschafft. Daher kann ich dir auch nicht weiterhelfen.

                          Vielleicht ist es doch nicht mod_perl? MudGuard hat mich mit seiner Frage darauf gebracht (habe dummerweise stillschweigend angenommen er kennt die Ursache und das müsste der Grund sein!) .
                          Wenn Du aber sagst, du hast es nicht geschafft, dann kann ich es erst recht nicht geschafft haben!
                          Woran erkennt man den Unterschied genau?
                          Ich habe perl.exe umbenannt und es lief trotzdem (auch nach Systemneustart). Ich weiss daher gar nicht, welches Programm eigentlich aufgerufen wird?

                          1. Das hat nichts mit Perl zu tun, du hast deinen Server evtl. so konfiguriert, dass er Perl als mod_per startet. Du Glücklicher, ich hab das bei mir lokal noch nicht geschafft. Daher kann ich dir auch nicht weiterhelfen.
                            Vielleicht ist es doch nicht mod_perl? MudGuard hat mich mit seiner Frage darauf gebracht (habe dummerweise stillschweigend angenommen er kennt die Ursache und das müsste der Grund sein!) .

                            Sagen wir mal so, nachdem was du uns schilderst, kann es nur daran liegen.

                            Wenn Du aber sagst, du hast es nicht geschafft, dann kann ich es erst recht nicht geschafft haben!

                            Naja, evtl. hast du ein fertiges System, das mod_perl von anfang an integriert. Ich hab versucht alles von Hand zu installieren.

                            Woran erkennt man den Unterschied genau?

                            Wie gesagt hab mod_perl noch nciht zum laufen gekriegt.

                            Ich habe perl.exe umbenannt und es lief trotzdem (auch nach Systemneustart). Ich weiss daher gar nicht, welches Programm eigentlich aufgerufen wird?

                            Das welches bei dir installiert ist, dass Wissen wir nicht.

                            Struppi.

                            --
                            Javascript ist toll (Perl auch!)
                            1. Das welches bei dir installiert ist, dass Wissen wir nicht.

                              Vielleicht kennst Du aber ein Merkmal

                              • Eintrag in Registry
                              • vorhandenes Programm
                              • o.ä., an dem man erkennt, ob mod_perl oder nicht.
                                Welche Alternative(n) kennst Du denn?
                                Danke
                                Barnabas
                            2. Hallo Struppi,
                              wenn ich in dem Skript die Variable $zahl nicht mit "my $zahl;" sondern mit "use vars ($zahl);" definiere, läuft es auch auf meinem Server.
                              Hast Du dafür eine Erklärung?

                                
                              #!/usr/bin/perl -w  
                              use strict;  
                              use LWP::UserAgent;  
                                                                                 #### my  ($zahl);  
                                                                                 use vars ($zahl);  
                              sub getinc  
                                 {print "*** \$zahl: $zahl ***<br>";  
                                 $zahl= $zahl+1;}  
                              use CGI;  
                              use CGI::Carp qw(fatalsToBrowser);  
                              print "Content-type: text/html\n\n";  
                                                                                  $zahl = 1;  
                              print <<AAA;  
                              <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
                              <html><head></head><body>  
                              AAA  
                              getinc ();  
                              print <<GGG;  
                              </div>  
                              </body>  
                              </html>  
                              GGG  
                              
                              
                                1. http://modperlbook.org/html/ch10_01.html#pmodperl-CHP-10-EX-1

                                  Danke,
                                  aber ich verstehe nur Bahnhof.
                                  Ich gebs auf!