Reloadsperre
Marcus Vieß
- cgi
Problem bei meinem Counter mit der Reloadsperre :
#############################
#############################
sub relaodsperre {
foreach $IPEINTRAG (@logip) {
if ("$ipAdresse\n" eq $IPEINTRAG) {
&grafik;
exit;
}
}
}
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 ...
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
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
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
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