Sören: Newbieproblem -» Einlesen und Schreiben von listen

Moin Leute!

Jetzt habt ihr einen Newbie mehr auf eurem Forum! ;-)
Das soll sich aber schnell ändern! *g*
Also zum Problem:

Hab nur ein Skript geschrieben was eine html Datei komplett in einer Liste speichert und dann eine neue html Datei öffnet und die Liste dareinschreibt. (Ich hoffe die Wörter mit dem @ davor sind Listen *fg*)

Skript:

#!/usr/bin/perl

$eingabedatei = "eingabe.html";
$ausgabedatei = "ausgabe.html";

open (EINGABE,"$eingabedatei");
@text = <EINGABE>;
close(EINGABE);

open(AUSGABE,">$ausgabedatei");
print AUSGABE "@text";
close(AUSGABE);
print "Die Ausgabedatei $ausgabedatei wurde erfolgreich erstellt!";

eingabe.html:

<html>
<head>
<body>
<p>Test</p>
</body>
</html>

Aber als Ausgabe kommt jetzt:

<html>
<head>
<body>
<p>Test</p>
<body>
</html>

also ab head kommt immer noch ein leerzeichen vor jeder zeile. (ich hoffe man erkennt das in der geposteten nachricht)
Was mach ich da falsch? Oder ist das ganz normal? Und wenn ja, wie umgehe ich sowas? Danke für eure Hilfe! :-)

Gruß Sören

  1. hm, konnte man doch nicht sehen! :-)

    also:

    <html>
    #<head>
    #<body>
    #<p>Test</p>
    #<body>
    #</html>

    die # Zeichen stehen für die Leerzeichen! ;-)

    1. Hallo Sören,

      Mit 'print "@liste";' gibst Du die Elemente der Liste, getrennt durch das Zeichen das in $" ($LIST_SEPARATOR) angegeben ist, aus.
      Mit 'print @liste;' werden die Listenelemente einfach ohne Trennzeichen ausgegeben.  
      Variablen müssen zur Ausgabe imho nicht unbedingt in Anführungszeichen("") stehen, es sei denn ein bestimmter Effekt (z.B.: Listenelementtrennung, Text mit Variablen mischen,..) ist erwünscht.

      Gruß AlexBausW

      Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html

    2. Hi,

      hm, konnte man doch nicht sehen! :-)

      dann probiere ich es mal mit festen Leerzeichen ("&#160;"):
       <head>
        <body>
         <p>Test</p>
        <body>
       </html>

      mfG - Michael

  2. Hi,

    Jetzt habt ihr einen Newbie mehr auf eurem Forum! ;-)

    willkommen :-)

    Da Dein Problem schon gelöst ist, gestatte ich mir mal eine kleine Codeoptimierung:

    #!/usr/bin/perl

    #!/usr/bin/perl -w
    use strict;

    $eingabedatei = "eingabe.html";
    $ausgabedatei = "ausgabe.html";

    my $eingabedatei = '/complete/path/to/eingabe.html';
    my $ausgabedatei = '/complete/path/to/ausgabe.html';

    Zumindest im CGI-Kontext weißt Du nie, in welchem Verzeichnis Du gerade bist!

    Ansonsten nimm wenigstens Singlequotes statt Doublequotes.

    open (EINGABE,"$eingabedatei");

    open(EINGABE, $eingabedatei) or die "Kann $eingabedatei nicht oeffnen: $!";

    @text = <EINGABE>;

    my @text = <EINGABE>;

    close(EINGABE);

    close(EINGABE); # :-)

    open(AUSGABE,">$ausgabedatei");

    open(AUSGABE,">$ausgabedatei") or die "Kann $ausgabedatei nicht oeffnen: $!";

    print AUSGABE "@text";

    print AUSGABE @text;

    close(AUSGABE);

    close(AUSGABE) or die "Kann $ausgabedatei nicht schliessen: $!";

    print "Die Ausgabedatei $ausgabedatei wurde erfolgreich erstellt!";

    Dies kannst Du nur dann wissen, wenn Du mit 'or die' die kritischen Operationen auf korrekte Durchführung überprüft hast. So sieht Dein Script dann aber gut aus :-)

    Cheatah

    1. hi ho

      $eingabedatei = "eingabe.html";
      $ausgabedatei = "ausgabe.html";
      my $eingabedatei = '/complete/path/to/eingabe.html';
      my $ausgabedatei = '/complete/path/to/ausgabe.html';

      Zumindest im CGI-Kontext weißt Du nie, in welchem Verzeichnis Du gerade bist!

      Ansonsten nimm wenigstens Singlequotes statt Doublequotes.

      wo wir gerade dabei sind....ich habe mir angewoehnt, pfadunabhaengig zu arbeiten :-)

      use FindBin '$Bin';

      my $eingabedatei="$Bin/eingabe.html";  # oder der entsprechende relative Pfad zum aktuellen Verzeichnis
      my $ausgabedatei=... dito

      problematisch wird diese Methode natuerlich nur, wenn ich auf Verzeichnisse *parallel* zum cgi-bin/ zugreifen will, fuer alles unterhalb desselben finde ich es allerdings optimal.

      cua

      n.d.p.

      1. Hi auch,

        use FindBin '$Bin';
        ...
        problematisch wird diese Methode natuerlich nur, wenn ich auf Verzeichnisse *parallel* zum cgi-bin/ zugreifen will

        Warum? Du kannst doch über "$Bin/../nebenan" dorthin positionieren (falls Du keine Lust hast, $Bin zu parsen und die letzte Verzeichnisebene herauszuschneiden).
        Du mußt nur sicher sein, daß Du im Pfad- und nicht im URL-Universum denkst (falls beide unterschiedlich gemapped sind).

        mfG - Michael

        1. hi ho

          Warum? Du kannst doch über "$Bin/../nebenan" dorthin positionieren (falls Du keine Lust hast, $Bin zu parsen und die letzte Verzeichnisebene herauszuschneiden).
          Du mußt nur sicher sein, daß Du im Pfad- und nicht im URL-Universum denkst (falls beide unterschiedlich gemapped sind).

          schon klar, es geht mir nur darum, dass ich eben nicht wirklich weiss, wo das cgi-bin/ liegt (im Pfad-universum), der Server koennte (oder hat meistens sogar) ja eine Umleitung von http://tralala.de/cgi-bin/ (URL-Universum)
          auf /pfad/zum/cgi waehrend die www-root voellig woanders liegen kann, das meinte ich eigentlich, deshalb sollte man sich ziemlich sicher sein, wo man sich genau im Pfad-Universum befindet.

          cua

          n.d.p.

          1. Noch'n hi,

            Du mußt nur sicher sein, daß Du im Pfad- und nicht im URL-Universum denkst (falls beide unterschiedlich gemapped sind).
            schon klar, es geht mir nur darum, dass ich eben nicht wirklich weiss, wo das cgi-bin/ liegt (im Pfad-universum), der Server koennte (oder hat meistens sogar) ja eine Umleitung von http://tralala.de/cgi-bin/ (URL-Universum)
            auf /pfad/zum/cgi waehrend die www-root voellig woanders liegen kann, das meinte ich eigentlich, deshalb sollte man sich ziemlich sicher sein, wo man sich genau im Pfad-Universum befindet.

            Aber letzteres ist unabhängig von der relativen Adressierung der Fall (auch wenn Du absolute Pfade verwendest, mußt Du sie kennen).
            Deshalb würde ich relativ adressieren, (fast) wo immer ich kann (egal, ob ich andere Module "require" oder Dateien "open"e) - dann habe ich die Chance, z. B. meinen kompletten CGI-Teilbaum (mit z. B. lokalen Konfigurationsdateien etc.) bei einer Verschiebung auf einen anderen Server ohne Source-Anpassungen lauffähig zu behalten. Gerade das ist auch ein möglicher Grund für eine Substruktur des CGI-Verzeichnisses ("shared", you know ...).

            mfG - Michael

          2. Hi,

            schon klar, es geht mir nur darum, dass ich eben nicht wirklich weiss, wo das cgi-bin/ liegt (im Pfad-universum),

            das ist vermutlich der Grund, weshalb ich %ENV der Modul-Methode ausnahmsweise vorziehe ;-)

            Cheatah