Joachim Wollmann: Linkdaten?

HTML

<html>
<head>
<title>jj</title>
<meta name="author" content="xx">
<meta name="generator" content="Ulli Meybohms HTML EDITOR">
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">

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

</body>
</html>

CGI

if ($ENV{'REQUEST_METHOD'} eq "GET") {
    $buffer = $ENV{'QUERY_STRING'};
} else {
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

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);

$url = &param('url');

@text=("<html>
  <head>
  <title>Kommentarseite</title>
  <style>
<!--
#m{
position:absolute;
left:55px;
top:60px;
}
#m2{
position:absolute;
left:20px;
top:20px;
}
-->
</style>
  </head>
  <body>
  <div id="m2"><img src="themamen.gif" width="441" height="470" border="0" alt=""></div>
  <div id="m">
  <form action="../cgi-bin/beitrag.pl" method=post>
  <font color=#0060FF>
  <img src="../line.gif" width="380" height="3" border="0" alt=""><br>
  Username <input name="",$url,"" size=15 maxlength=15>
  <br>
   <img src="../line.gif" width="380" height="3" border="0" alt=""><br>
  Passwort <input name="Username" size=15 maxlength=15>
  <br>
  <img src="../line.gif" width="380" height="3" border="0" alt=""><br>
  Thema <input name="Thema" size=30 maxlength=40>
  <br>
  <img src="../line.gif" width="380" height="3" border="0" alt=""><br>
  Beitrag<br>
  <textarea name="Beitrag" rows=8 cols=40 wrap=virtual></textarea>
  <p></p>
  <table border="0" cellpadding="0" cellspacing="8"  bgcolor="#FFFFFF" width=400
   height="10">
  <tr><td><img src="smiley.gif" width="18" height="18" border="0" alt=""></td>
  <td><font color=#0060FF>S1</font></td>
   <td><img src="smiley2.gif" width="19" height="19" border="0" alt=""></td>
  <td><font color=#0060FF>S2</font></td><td rowspan=5><font color=#0060FF>Um Ihren Beitrag ein bisschen auzulockern haben wir für Sie Smiley-Codes bereitgestellt. Einfach Code(z.B.: S1) einfügen und Sie
  können dann in Ihrem Beitrag einen Smiley an Stelle des Codes vorfinden.</font></td></tr>
   <tr><td><img src="smiley3.gif" width="21" height="19" border="0" alt=""></td>
  <td><font color=#0060FF>S3</font></td>
   <td><img src="smiley4.gif" width="19" height="19" border="0" alt=""></td>
  <td><font color=#0060FF>S4</font></td></tr>
   <tr><td><img src="smiley5.gif" width="19" height="19" border="0" alt=""></td>
  <td><font color=#0060FF>S5</font></td>
   <td><img src="smiley6.gif" width="19" height="19" border="0" alt=""></td>
  <td><font color=#0060FF>S6</font></td></tr>
  </table>
  <img src="../line.gif" width="380" height="3" border="0" alt="">
  <br>
  <input type=submit value="Absenden"><br>
  </font>
  </form>
  </div>

</body>
  </html>");

open DATEI, ">../forum/ein2.htm" or die "Kann Datei counter.txt nicht oeffnen: $!";
print DATEI @text;
close(DATEI);

print @text;

Hallo

Das obrige Script funktioniert nicht so ganz!! Wie kann man Linkdaten (..?url=tttffdie.zip) einlesen und
damit ganz normal weiterarbeiten??

DANKE

  1. Hallo Joachim!

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

    Das ist richtig.

    if ($ENV{'REQUEST_METHOD'} eq "GET") {
        $buffer = $ENV{'QUERY_STRING'};
    } else {
        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

    Das kannst Du Dir sparen, benutze einfach:
    use CGI qw(:standard);

    dann geht auch diese Zeile:

    $url = &param('url');

    Hier willst Du eigentlich einen Skalar beschreiben "$text", @text ist aber eine Liste.
    ausserdem geht sowas nicht über mehere Zeilen.

    @text=("<html>

    Das geht so:
    $text=<<end_text;
    <html>
      <head>
      <title>Kommentarseite</title>
      <style>
    <!--
    #m{
    position:absolute;
    .
    .
    .
    .
    </div>

    </body>
      </html>");
    end_text

    print @text;

    Und hier dann:
    print $text;

    Gruß Frank

    P.S. beachte die "kompische" Schreibweise der Marke end_text, mal mit ";", am Ende des Blocks ohne!

    1. Hi FrankS,

      Hier willst Du eigentlich einen Skalar beschreiben "$text", @text ist aber eine Liste.
      ausserdem geht sowas nicht über mehere Zeilen.

      Es geht schon (hab`s mal aus Spaß mit print versucht, und jetzt auf eine Variablenzuweisung angewendet):

      $text =  "Das ist nur ein Test
      wie Perl mit zu mehrzeiligen
      strings umzugehen pflegt\n";
      print $text;

      Auch die Zuweisung an die Liste sollte eigentlich funktionieren. @text enthält dann eben nur ein Element.

      @text=("<html>
      Das geht so:
      $text=<<end_text;
      <html>

      [...]

      </html>");
      end_text

      print @text;
      Und hier dann:
      print $text;

      Gruß AlexBausW (der Dir hoffentlich nicht auf den Schlips getreten hat ;-)

      1. Hi AlexBausW!

        Man lernt immer wieder was dazu!

        Gruß Frank (der sich nicht auf den Schlips getreten fühlt ;-)

        P.S. aber "sauberer" ist meine Lösung doch, oder? Andererseits: Hauptsache es funktioniert: "Ein gutes Perlscript ist ein funktionierendes Perscript"  (so oder so ähnlich habe ichs neulich in irgend einem Perl-Buch gelesen).

  2. 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