AlexBausW: Linkdaten?

Beitrag lesen

Hallo Joachim

[...]

<a href="cgi-bin/counter.pl?url=tttffdie.zip">Link</a>

[...]

CGI

if ($ENV{'REQUEST_METHOD'} eq "GET") {
    $buffer = $ENV{'QUERY_STRING'};

-> In $buffer steht dann der im Link übergebene String

} else {
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

Wenn Du nur _einen_ Parameter _ausschließlich_ in einem Link übergeben willst, kanns Du auf die Hälfte des Klumbatschs verzichten ;-)
$buffer = $ENV{'QUERY_STRING'};

open NEU, "counter.txt" or die "Kann counter.txt nicht oeffnen: $!";
$dataa = <NEU>;
$dataa= $dataa + 1;
close(NEU);
open DATEI, ">counter.txt" or die "Kann Datei counter.txt nicht oeffnen: $!";
print DATEI $dataa;
close(DATEI);

Hier willst Du ja anscheinend zählen, wie oft der obige Link angeKLICK!(tm) (SCNR;-) wurde.
Das solltest Du ein wenig optimieren, damit nicht zwei schreibende Zugriffe zur selben Zeit erfolgen.

zum lesen und schreiben öffnen

open (COUNT, "+<counter.txt") or die "Kann counter.txt nicht oeffnen: $!";  
flock(COUNT,2);  # Datei mit flock sperren (exclusiv) / zweiter Zugriff wartet, bis Datei wieder geschlossen wurde
$dataa = <NEU>;   # erste Zeile einlesen
$dataa++         # Zahl um eins erhöhen    
seek (COUNT,0,0); # gehe an Anfang der Datei
truncate(COUNT,0); # und schneide den Rest ab (= löschen)
print COUNT $dataa; # schreibe Zähler in counter.txt
close (COUNT) or die "Kann counter.txt nicht schliessen: $!";

schließt counter.txt und hebt den Lock auf

$url = &param('url');

Da der Parameter ja in $buffer steht, musst Du anders rankommen:

  1. $url = $buffer; # dann hättest Du auch beim Einlesen des Parameters schon $url nehmen können
       $url =~ s/url=//i; # case-insensitiv, damit Du auch ?URL=datei.zip schreiben kannst :-)
  2. @param = split /=/, $buffer;
       $url = $param[1];
  3. oder wie Frank schon sagte, statt eigenem Einlesen des Parameters
       "use CGI;" verwenden, dann funktioniert die Zeile auch

@text=("<html>

[...]

<td><img src="smiley2.gif" width="19" height="19" border="0" alt=""></td>

[...]

</html>");

Neben den Hinweisen von Frank, noch einen hierzu:
Wenn Du $text = ' <html>.....</html>'; also einfache Anführungszeichen verwendest, kannst Du Dir das quoten der Anführungszeichen im String sparen.
Da Du ja scheinbar keine Variablen im String ersetzen musst, kannst Du ' ' verwenden, was die möglichen Fehler reduziert (was hab` ich schon durch fehlendes \ vor " Fehler produziert ;-)

hth
Gruß AlexBausW