Marcus Vieß: Reloadsperre

Problem bei meinem Counter mit der Reloadsperre :

#############################

Überprüfen auf RELOAD

#############################
sub relaodsperre {
   foreach $IPEINTRAG (@logip) {
      if ("$ipAdresse\n" eq $IPEINTRAG) {
         &grafik;
         exit;
      }
   }
}

schreiben der letzten IP

while ($#logip >= 2){
    shift @logip;
  }

$ipAdresse=$ENV{'HTTP_CLIENT_IP'};
  if($ipAdresse eq ""){
  $ipAdresse=$ENV{'REMOTE_ADDR'};
  }
  push(@logip,$ipAdresse."\n");

open(logfile,">log.txt") &FEHLER("Kann Datei <b>log.txt</b> nicht erstellen.");
  print (logfile @logip);
  close(logfile);

laufen tut das scripte zwar aber er zählt und zählt ...

  1. Hi,

    while ($#logip >= 2){
        shift @logip;
      }

    laufen tut das scripte zwar aber er zählt und zählt ...

    was heißt "es zählt und zählt"?

    Ich tippe mal darauf, daß Du $#array mißverstanden hast. Dadurch erfährst Du _nicht_ die Anzahl der Elemente in einem Array, sondern nur einen Zeiger auf das letzte Element! Je nach Umgebung kann das auch 42 ergeben, obwohl das Array leer ist.

    Was Du suchst, ist

    scalar @array

    _Das_ ist nämlich die Anzahl der Elemente.

    Cheatah

    1. Hallo Cheatah,

      Ich tippe mal darauf, daß Du $#array mißverstanden hast. Dadurch erfährst Du _nicht_ die Anzahl der Elemente in einem Array, sondern nur einen Zeiger auf das letzte Element! Je nach Umgebung kann das auch 42 ergeben, obwohl das Array leer ist.

      Dann habe ich es wohl auch Missverstanden, obwohl ich dachte es ausreichend genau gelesen zu haben ;-)
      Also laut "Programmieren mit Perl" (deutsche Ausgabe) liefert $#array den Index des letzten Elementes von @array zurück. $#array ist um 1 kleiner als scalar(@array) weshalb scalar(@array) == $#array + 1 immer true sein soll. Zuweisungen an $#array verändert die Länge von @array, wobei bei einer Verkürzung mit anschließender Verlängerung die abgeschnittenen Elemente, entgegen früherer Versionen von Perl, nicht wieder hergestellt werden.
      Die Dokumentation von ActivePerl schlägt imho in etwa in dieselbe Kerbe:

      ===cut===
      The length of an array is a scalar value. You may find the length of array @days by
      evaluating $#days, as in csh. Technically speaking, this isn't the length of the array; it's
      the subscript of the last element, since there is ordinarily a 0th element. Assigning to
      $#days actually changes the length of the array. Shortening an array this way destroys
      intervening values. Lengthening an array that was previously shortened does not recover
      values that were in those elements. (It used to do so in Perl 4, but we had to break this to
      make sure destructors were called when expected.)

      ===cut===
      You can truncate an array down to nothing by assigning the null list () to
      it. The following are equivalent:

      @whatever = ();
          $#whatever = -1;

      ===cut===
      So in general you can assume that
          scalar(@whatever) == $#whatever + 1;

      ===cut===
          $#days              # the last index of array @days

      Hoffentlich ist meine Beweisführung nicht löcherig, aber demnach müsste shift(@array) $#array um 1 erniedrigen, wie es im Skript von Markus imho auch das erwartete Verhalten ist.
      Vielleicht kannst Du ja das nochmal genauer aufklären, aber ich habe mich bis jetzt an das oben Zitierte gehalten, und bin damit wunderbar gefahren (vielleicht hatte ich ja bis jetzt auch nur Glück :-)

      Gruß AlexBausW

      Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html

      1. Hello Me,

        [...] Je nach Umgebung kann das auch 42 ergeben, obwohl das Array leer ist.

        Ich vermute Cheatah meint, wenn jemand aus irgendeinem Grund $[ auf einen Wert != 0 gesetzt hat, gilt nur: scalar(@array) == $#array - $[ + 1;
        Also könnte $#array deutlich stärker von scalar(@array) abweichen, als um den Wert 1. Aber wann und wo könnte das zutreffen, bzw. Schwierigkeiten verursachen?

        Gruß AlexBausW

        Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html

        1. Hi,

          Hello Me,

          :-)

          [...] Je nach Umgebung kann das auch 42 ergeben, obwohl das Array leer ist.

          Ich vermute Cheatah meint, wenn jemand aus irgendeinem Grund $[ auf einen Wert != 0 gesetzt hat, gilt nur: scalar(@array) == $#array - $[ + 1;

          Exakt das.

          Aber wann und wo könnte das zutreffen, bzw. Schwierigkeiten verursachen?

          Das Beispiel in perldoc perlvar bezieht sich auf Zählungen, die nicht wie in der Informatik üblich bei 0, sondern bei 1 beginnen. Denkbar ist aber auch, daß irgendjemand $[ nutzt, um (auf ziemlich kranke Weise *g*) "gezielt" auf ein bestimmtes Element im Array zuzugreifen - $[ ist im globalen Scope verfügbar, eine Zählvariable nur dort, wo sie deklariert wurde.

          Aber wie heißt es in der Doku schon: "Its use is discouraged." Trotzdem, auf $#array ist im Gegensatz zu scalar @array kein Verlaß, wenn man die Zahl der Elemente haben möchte. Zu der von Dir genannten Berechnung gibt es in der Praxis jedenfalls i.d.R. keinen Grund... zumal sie ziemlich unperformant ist im Vergleich zur Alternative. Ich nehme aber an, Du hast sie eh nur zur Verdeutlichung genannt :-)

          Cheatah