$xNeTworKx: Daten per Referenz ändern ?

Hi,
folgendes Problem : Ich habe eine Zähler, der mir am Anfang der Seite die gezählten Daten insgesamt ausgeben soll. Die Daten werden erst "weiter unten" eingelesen, also will ich per Zeiger den oberen Zähler ändern, nur bekomme ich immer folgende Fehlermeldung wenn ich es wie folgt mache :

Software error:

Can't use string ("0") as a SCALAR ref while "strict refs" in use at c:\apache\ACID4U~1\de\STATIS~1\index.cgi line 48, <FILE> line 1.

------------------------
my $visits_thismonth = 0;
.
.
.
.
print "<th><td class="statistikmiddle">gezählte Besuche des aktuellen Monats " . $visits_thismonth . "</td></th>\n";
.
.
.
.
.
opendir(DIR,"../../cgi/statistik/$year/$mon") or die "Cant open ../../cgi/statistik/$year/$mon : $!\n";
while (defined($_ = readdir DIR))   {
     if ($_ =~ /^\d\d?.txt$/)   {
     open(FILE,"../../cgi/statistik/$year/$mon/$_") or die "Cant open $_ : $!\n";
      chomp(my $input = <FILE>);
      $$visits_thismonth += $input; #HIER DIE REFERENZ
      my $shown_date = substr($_, 0, length($_) - 3);
      print '<tr><td class="statistikright">' . sprintf("%2d", $shown_date) . ".$mon :</td><td>$input</td></tr>\n";
      close FILE;
     }
}
closedir DIR;

Bei Subroutinen gehe ich immer so vor, und es klappt auch, aber warum hier nicht, verstehe ich nicht ganz ?

$xNeTworKx.

  1. Hallo!

    my $visits_thismonth = 0;
    .
          $$visits_thismonth += $input; #HIER DIE REFERENZ

    Wie wärs einfach híermit:
    $visits_thismonth += $input;

    Du darfst an dieser Stelle die Variable nicht als Referenz benutzen, weil es keine ist. Bei Subroutinen machst du das so, weil ich annehme, das du die Variable als Referenz übergibst - in der Art:
    &subroutine($variable); # was bei Skalaren im übrigen nicht nötig ist

    Ich denke, das sollte das Problem lösen, ansonsten noch mal Bescheid sagen.

    Gruß Maik

    1. Hallo,

      Wie wärs einfach híermit:
      $visits_thismonth += $input;

      Sorry, aber ich verstehe nicht genau was du meinst.
      Wie soll der Wert am Anfang des Script verändert werden, in dieser Zeile: ?

      print "<th><td class="statistikmiddle">gezählte Besuche des aktuellen Monats " . $visits_thismonth . "</td></th>\n";

      $visits_thismonth wird ja erst nach dieser Zeile berechnet, somit muss ich im Nachhinein den Wert in die Variable schreiben, und genau das ist mein Problem.

      $xNeTworKx.

      1. Hallo,

        $visits_thismonth wird ja erst nach dieser Zeile berechnet, somit muss ich im Nachhinein den Wert in die Variable schreiben, und genau das ist mein Problem.

        Ähm, wenn $visits_thismonth erst nach der Ausgabe errechnet wird, ist es schon zu spät. Du hast im Ausgangsposting etwas davon geschrieben, dass du Referenzen bereits erfolgreich mit Funktionen (Subroutinen) einsetzt, aber auch da wird das ungefähr so ablaufen:

        my $wasauchimmer = 0;
        hole_werte($wasauchimmer);
        ....
        print 'das steht in $wasauchimmer:'. $wasauchimmer ."\n";
        ....
        sub hole_werte
        {
        my $ref_auf_wasauchimmer = shift;
        $$ref_auf_wasauchimmer = 42;
        }

        Dabei wird aber, und das ist entscheidend, die Funktion aufgerufen _bevor_ die Ausgabe erfolgt. Lediglich der Code der Funktion ist nach der Ausgabe, ausgeführt wird er aber im Programmablauf vorher.
        Egal, wie Du es anstellst, Du mußt den Ausgabewert eben vor der Ausgabe berechnen.

        Außerdem dürfe beim print-Aufruf die Referenzierung falsch sein, da hier ja der Wert und nicht die Referenz der Variable ausgegeben werden soll.

        Und noch etwas, Referenzen sind zwar eine tolle Sache, aber in meinem obigen Beispiel würde ich es  eher mit einem Rückgabewert realisieren. Für mich machen Refernenz eher dann einen Sinn, wenn ich bereits eine komplexere Datenstruktur habe, und die nicht per Übergabeliste über geben will, oder wenn ich einer Funktion mehrere Arrays übergeben will, ohne deren Struktur ztu verlieren. Aber bei einfachen Variablen und wenigen Werten ziehe ich doch die 'altbackene' Variante mit Übergabe- und Rückgabeliste vor. Aber das könnte eine Geschmacksfrage sein und andere könnten es anders sehen.

        Grüße
          Klaus

        1. Hi,

          Ähm, wenn $visits_thismonth erst nach der Ausgabe errechnet wird, ist es schon zu spät. Du hast im Ausgangsposting etwas davon geschrieben, dass du Referenzen bereits erfolgreich mit Funktionen (Subroutinen) einsetzt, aber auch da wird das ungefähr so ablaufen:

          Genau das wollte ich eigentlich, nach der Ausgabe den Wert überschreiben :(
          Bis jetzt habe ich hier keine Subroutinen verwendet. Ich habe in Ausgangsposting eigentlich nur die Vorgehensweise wie bei Subrountinen gemeint, trotzdem danke.

          $xNeTworKx.

          1. Hallo!

            Hat sich das Problem gelöst? Was ich nicht verstehe :
            Wenn das Script eine Ausgabe erzeugt, warum machst Du das nicht am Ende des Scriptes nachdem alle Berechnungen durchgeführt wurden? Oder warum kannst Du diese eine für die Ausgabe wichtige Berechnung nicht schon vorher machen?

            Grüße
            Andreas

            1. Hi,

              Hat sich das Problem gelöst? Was ich nicht verstehe :
              Wenn das Script eine Ausgabe erzeugt, warum machst Du das nicht am Ende des Scriptes nachdem alle Berechnungen durchgeführt wurden? Oder warum kannst Du diese eine für die Ausgabe wichtige Berechnung nicht schon vorher machen?

              Das Ganze ist eine ziemliche Datenmenge (Klicks des Monats pro Tag aufgelistet + Klicks des ganzen Jahren werden in einem Monatsbalken ausgegeben) . Ich gib die Daten gleich beim Einlesen aus, weil es irgendwie fast nicht zumutbar ist, diese ganzen Daten durch das ganze Script mitzuschleppen. Ich fand, es sieht einfach besser aus wenn da steht :

              Besuche des ganzen Monats : 4564
              1.12 : 203
              2.12 : 140 (normalerweise mit Grafikbalken)

              Ich mache es jetzt aber doch so, das am Ende die Gesamtzahl steht, sonst würde das Script zu aufgebläht werden.

              $xNeTworKx.