Marcel Georgii: Split

Hallo zusammen

As Voraussetzung liegt eine Datei (dynip.txt) die so aussieht:

------------------------copy----------------------------
217.162.201.57|36|45|12|26|1|2003

------------------------paste---------------------------

im gleichen Verzeichis wie mein CGI-Script. Das Script soll die einzelnen Zellen zwischen den | auslesen und in Variablen speichern damit ichs später weiterbenutzen kann. Das Script sieht so aus:

------------------------copy----------------------------
 open(FILE,"<dynip.txt");
  @raw_data = <FILE>;
  close(FILE);
  chop($raw_data);
  ($ip,$newsec,$newmin,$hr,$mday,$newmon,$newyear) = split( |/,$raw_data);
  print "Content-Type: text/html\n\n";
  print "<font face="arial" size="3">\n";
  print "<table border="0">\n";
  print "<tr><td width="75" align="left"><b>IP:</b></td><td width="125" align="right">$ip</td></tr>\n";
  print "<tr><td width="75" align="left"><b>Time:</b></td><td width="125" align="right">$hr:$newmin:$newsec</td></tr>\n";
  print "<tr><td width="75" align="left"><b>Date:</b></td><td width="125" align="right">$mday.$newmon.$newyear</td></tr>\n";
  print "</table>\n";
  print "</font>";
------------------------paste---------------------------

Das darstellen den HTML-Tabelle und so geht alles aber die Variablen sind dann leer!

Was habe ich da falsch gemacht?

Vielen Dank!

  1. Hallo Marcel,

    Versuch es mal dein Splitfonktion so zu schreiben:
    ($ip,$newsec,$newmin,$hr,$mday,$newmon,$newyear) = split(/|/,$raw_data);

    Du hast "/" vergessen.

    Gruss
    x-VieW

    1. Oh sry da hats einen Fehler beim kopieren gegeben. Das "/" ist natürlich da!

      ---------------------------------copy--------------------------------
        open(FILE,"<dynip.txt");
        @raw_data = <FILE>;
        close(FILE);
        chop($raw_data);
        ($ip,$newsec,$newmin,$hr,$mday,$newmon,$newyear) = split(/|/,$raw_data);
        print "Content-Type: text/html\n\n";
        print "<title>Server Status</title>\n";
        print "<font face="arial" size="3">\n";
        print "<table border="0">\n";
        print "<tr><td width="75" align="left"><b>IP:</b></td><td width="125" align="right">$ip</td></tr>\n";
        print "<tr><td width="75" align="left"><b>Time:</b></td><td width="125" align="right">$hr:$newmin:$newsec</td></tr>\n";
        print "<tr><td width="75" align="left"><b>Date:</b></td><td width="125" align="right">$mday.$newmon.$newyear</td></tr>\n";
        print "</table>\n";
        print "</font>";
      ---------------------------------paste-------------------------------

      Irgendwoanders muss der Fehler sein !?!

      1. @raw_data = <FILE>;

        Hier liegt der Fehler es sollte in $ nicht ein @ sein! Sry habs gerade bemerkt! Trotzdem Danke!

        1. Hallo,

          Hier liegt der Fehler es sollte in $ nicht ein @ sein! Sry habs gerade bemerkt! Trotzdem Danke!

          Das ist einer der Fehler, den man mit
           use strict;
          recht schnell finden kann;-)

          Grüße
            Klaus

  2. Hallo Marcel,

    open(FILE,"<dynip.txt");
      @raw_data = <FILE>;

    Hier liest du die Datei dynip.txt in das _Array_ @raw_data ein.

    close(FILE);
      chop($raw_data);

    Nun arbeitest du mit dem _Skalar_ $raw_data.

    ($ip,$newsec,$newmin,$hr,$mday,$newmon,$newyear) = split(|/,$raw_data);

    Es fehlt ein "/" (copy & paste ?)

    Du verwechselst den Skalar $raw_data mit dem Array @raw_data.
    Warum liest du die Datei in ein Array ein, wenn sie nur eine Zeile hat?

    Grüße,

    Peter

  3. Hallo zusammen

    As Voraussetzung liegt eine Datei (dynip.txt) die so aussieht:

    ------------------------copy----------------------------
    217.162.201.57|36|45|12|26|1|2003

    ------------------------paste---------------------------

    im gleichen Verzeichis wie mein CGI-Script. Das Script soll die einzelnen Zellen zwischen den | auslesen und in Variablen speichern damit ichs später weiterbenutzen kann. Das Script sieht so aus:

    ------------------------copy----------------------------

    #!/usr/bin/perl -w

    use strict;
    use CGI qw/:standard/;

    open(FILE,"<dynip.txt");

    open(FILE,"<dynip.txt") || die "Kann dynip.txt nicht öffnen. Weil: $!";

    @raw_data = <FILE>;

    chomp(my  @raw_data = <FILE>);

    close(FILE);
      chop($raw_data);

    weg damit!

    ($ip,$newsec,$newmin,$hr,$mday,$newmon,$newyear) = split( |/,$raw_data);

    my ($ip,$newsec,$newmin,$hr,$mday,$newmon,$newyear) = split( /|/,$raw_data);

    Damit ist aber nicht sicher, das Daten da sind.

    print "Content-Type: text/html\n\n";

    print header(), start_html();

    print "<font face="arial" size="3">\n";

    font face ist veraltet und dank CSS ziemlich überflüssig.

    print "<table border="0">\n";
      print "<tr><td width="75" align="left"><b>IP:</b></td><td width="125" align="right">$ip</td></tr>\n";
      print "<tr><td width="75" align="left"><b>Time:</b></td><td width="125" align="right">$hr:$newmin:$newsec</td></tr>\n";
      print "<tr><td width="75" align="left"><b>Date:</b></td><td width="125" align="right">$mday.$newmon.$newyear</td></tr>\n";
      print "</table>\n";
      print "</font>";

    Du kannst sowas wesentlich übersichtlicher mit dem CGI Modul berwerkstelligen, oder mit einem HERE Dokument.

    print <<TEXT;
    <table border="0">
    <tr><td width="75" align="left"><b>IP:</b></td>
    <td width="125" align="right">$ip</td></tr>
    <tr><td width="75" align="left"><b>Time:</b></td>
    <td width="125" align="right">$hr:$newmin:$newsec</td></tr>
    <tr><td width="75" align="left"><b>Date:</b></td>
    <td width="125" align="right">$mday.$newmon.$newyear</td></tr>
    </table>
    TEXT

    Aber wie gesagt, du kannst bei einer CGI Awendung nie sicher sein, das irgendwelche Variabeln gefüllt sind (auch bei anderen nicht) und von daher jede Variabel überprüfen oder zumindest mit einem Standardwert vorbelegen.

    Struppi