Nicolas Muehlen: Liste geordnet wieder ausgeben

Hallo zusammen,
ich habe jetzt endlich Zeit gefunden, mich mal etwas tiefer mit Perl zu beschäftigen, und versuche deshalb gerade einige ( zwar völlig sinnlose) Scripte zu schreiben, nur der Übung. Ich bin gerade bei den Listen angekommen und habe da ein kleines Problem, aber hier erstmal das Script

#!/usr/bin/perl

@Zeilen = ("");
  open(TEST, "<test.html") die "Fehler\n";
  while(<TEST>)
   {
    push(@Zeilen,$_);
   }
  close(TEST);
  for(@Zeilen)
   {
    if(/HTML/)
     {
      print "Content-type: text/html\n\n";
      print $_;
     }
    }

Ich will bei diesem Script einfach die Seite "test.html" mit Hilfe einer Liste durch das Script laufen lassen und sie dann genauso, wie sie "reinkam", wieder ausgeben. Allerdings zerlegt das Script immer die ganze HTML-Seite und spuckt auch nur die Hälfte wieder aus, obwohl die HTML-Datei ordnungsgemäß im ASCII-Modus hochgeladen ist. Weiß da jemand von euch Rat?
Viele Grüsse,

Nicolas Muehlen

  1. #!/usr/bin/perl

    @Zeilen = ("");
      open(TEST, "<test.html") die "Fehler\n";
      while(<TEST>)
       {
        push(@Zeilen,$_);
       }
      close(TEST);

    »»   print "Content-type: text/html\n\n";

    for(@Zeilen)
       {
       print $_;
        }

    Versuche es mal so.

    Gruß
    Jörg

    1. Hallo Jörg,

      Versuche es mal so.<<

      Ah ja, danke, das funktioniert :-)
      Viele Grüsse,

      Nicolas Muehlen

  2. Ich will bei diesem Script einfach die Seite "test.html" mit Hilfe einer Liste durch das Script laufen lassen und sie dann genauso, wie sie "reinkam", wieder ausgeben. Allerdings zerlegt das Script immer die ganze HTML-Seite und spuckt auch nur die Hälfte wieder aus, obwohl die HTML-Datei ordnungsgemäß im ASCII-Modus hochgeladen ist. Weiß da jemand von euch Rat?
    Viele Grüsse,

    Nicolas Muehlen

    Hallo,

    warum so kompliziert?

    es geht viel einfacher:

    #!C:/Programme/Perl/bin/perl
    $testfile = "C:/web/test.html";
    print "Content-type: text/html\n\n";
    open (FILE,"$testfile");
    @file = <FILE>;
    close (FILE);
    foreach $line (@file) { print "$line"; }

    Antikriegerische Grüsse,
    Robert

    1. Hallo Robert,

      #!/usr/bin/perl
      $testfile = "test";
      print "Content-type: text/html\n\n";
      open (FILE,"$testfile");
      @file = <FILE>;
      close (FILE);
      foreach $line (@file) { print "$line"; }
      <<

      Das sieht sogar noch besser aus, für das, was ich vorhabe. Allerdings wird immer nur das Content-type: text/html ausgegeben, $line scheint das Script irgendwie zu vergessen... Wo könnte denn da noch der Wurm stecken?
      Viele Grüsse,

      Nicolas Muehlen

      1. close (FILE);
        foreach $line (@file) { print "$line"; }

        Wo könnte denn da noch der Wurm stecken?

        Weiß, habe zwar auch noch nicht viel Ahnung von Perl, jedoch würde ich darauf tippen, daß "close (FILE);" wohl eher am Ende zu stehen hat. Ansonsten versucht man doch in eine geschlossene Datei etwas zu schreiben, oder?

        Gruß
              Julian

        1. hi!

          close (FILE);
          foreach $line (@file) { print "$line"; }
          Weiß, habe zwar auch noch nicht viel Ahnung von Perl, jedoch würde ich darauf tippen, daß
          "close (FILE);" wohl eher am Ende zu stehen hat. Ansonsten versucht man doch in eine
          geschlossene Datei etwas zu schreiben, oder?

          Nein, denn er schreibt ja nach STDOUT, nicht in eine normale Datei.

          bye, Frank!

      2. Hi,

        Das sieht sogar noch besser aus, für das, was ich vorhabe. Allerdings wird immer nur das Content-type: text/html ausgegeben, $line scheint das Script irgendwie zu vergessen... Wo könnte denn da noch der Wurm stecken?

        vermutlich hier:

        $testfile = "test";

        Wenn die Datei nicht vorhanden ist, liest er sie natürlich auch nicht ein... *grins* :-)
        Versuche es folgendermaßen:

        print "Content-type: text/html\n\n";
        open (FILE,"$testfile") or print "Datei wurde nicht gefunden!<br>\nFehler: $!";

        Cheatah

        1. Hi Cheatah,

          Wenn die Datei nicht vorhanden ist, liest er sie natürlich auch nicht ein... *grins* :-)<<

          Doch, die ist vorhanden :-) Muss natürlich $testfile = "test.html"; heißen, aber das ist im richtigen Script auch drin...
          Mittlerweile ist es so, daß im Telnet alles korrekt ausgegeben wird, aber über http kommt dann immer der wohlbekannte "Server error 500". Naja, ich werd einfach noch ein bisschen herumexpirementieren :-)
          Viele Grüsse,

          Nicoas Muehlen

          1. Hi,

            Wenn die Datei nicht vorhanden ist, liest er sie natürlich auch nicht ein... *grins* :-)<<

            Doch, die ist vorhanden :-) Muss natürlich $testfile = "test.html"; heißen, aber das ist im richtigen Script auch drin...

            möglicherweise ist sie trotzdem nicht vorhanden! Relative Pfade sind immer so eine Sache... gib die Datei doch mal absolut an, also /www/pfad/zur/test.html!

            Cheatah

  3. hi!

    Ich will bei diesem Script einfach die Seite "test.html" mit Hilfe einer Liste durch das Script laufen lassen und sie dann genauso, wie sie "reinkam", wieder ausgeben.

    Die einfachste und vor allem kürzeste Methode:
    === cut ===
    #!/usr/bin/perl
    open FILE, "<test.xml";
    print <FILE>;
    close FILE;
    === cut ===

    Wenn du die Zeilen noch vor der Ausgabe bearbeiten willst:
    === cut ===
    #!/usr/bin/perl
    open FILE, "<test.xml";
    while (<FILE>)
    {
      # irgendetwas mit $_ anstellen
      print; # gibt ohne weiteren paramter automatisch $_ aus
    }
    close FILE;
    === cut ===

  4. Hi,

    wenn ich das hier richtig interpretiere:

    for(@Zeilen)
       {
        if(/HTML/)
         {
          print "Content-type: text/html\n\n";
          print $_;
         }
        }

    willst Du den Content-type abhängig von einem Codewort in der Datei machen. Dazu ist es am geschicktesten (falls Du Einfluß darauf hast), das Codewort in der ersten Zeile zu definieren. Teste dann so:

    $Zeilen[0] =~ s/HTML/Content-type: text/html\n\n/;

    und gib danach for(@Zeilen) { print $_; } aus. Hier wird also in der ersten Zeile einfach nur HTML durch den passenden Content-type ersetzt. Du kannst die Zeile beliebig oft angepaßt wiederholen, also etwa so:

    $Zeilen[0] =~ s/TEXT/Content-type: text/plain\n\n/;
    $Zeilen[0] =~ s/GIF/Content-type: image/gif\n\n/;
    usw.

    Vergiß aber nicht, den Slash im MIME-Type zu maskieren ;-)

    Cheatah

    1. Hallo Cheatah,

      wenn ich das hier richtig interpretiere: willst Du den Content-type abhängig von einem Codewort in der Datei machen. <<

      Ich habe eigentlich vor, eine HTML-Seite durch das Script laufen zu lassen, sie durch das Script verändern zu lassen und sie dann durch das Script wieder auszugeben, allerdings, ohne was am Code der .html-Datei zu ändern... Daher will ich jetzt erstmal versuchen, die Seite einfach "durchlaufen" zu lassen und wenn das klappt, werde ich mich an das Verändern machen (wenn ich mich nicht irre, müsste was dazu ja in der <../../tgck.htm> stehen...).
      Viele Grüsse,

      Nicolas Muehlen