gary: if-Vergleich -> Blockanweisung

Guten Abend,

Ich habe eine CSV-Datei die sieht so aus:

L1,rauchen.txt,L2,rauchen.png,L3
R1,autos.txt,R2,autos.png,R3
O1,strom.txt,O2,strom.png,O3
U1,urlaub.txt,U2,urlaub.png,U3

Und eine Perl-Abfrage, die sieht so aus:

my $Layout1;
my $Thema;
my $Layout2;
my $Bild;
my $Layout3;
open(LESER, "<public/publisher.csv");
flock(LESER, LOCK_SH);

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

while(! eof(LESER)){

my $zeile = <LESER>;
my ($Layout1, $Thema, $Layout2, $Bild, $Layout3) = split(/,/,$zeile);

if($Layout1 == "L1") {
print "<!-- ############################### -->\n";
print "<!-- #Das ist die Klasse Text Links# -->\n";
print "<!-- ############################### -->\n";
print "\n";
print '<div class="inner_left_links">',"\n";
}

if($Layout1 == "R1") {
print "<!-- ################################ -->\n";
print "<!-- #Das ist die Klasse Text Rechts# -->\n";
print "<!-- ################################ -->\n";
print "\n";
print '<div class="inner_left_rechts">',"\n";
}
print $Layout1, $Thema, $Layout2, $Bild, $Layout3;
}

close(LESER);

Die Datei wird korrekt geöffnet. Die Daten werden Zeilenweise ausgelesen und anschliessend auf fünf Variablen verteilt. Habe das getestet, denn wie man sieht liefert die letzte Printanweisung den Beweis. Alles ok!

Nur müsste nach diesem Script die Div-Klassen nur zweimal im Quelltext der Shtml-Seite auftauchen- statt acht mal. Irgendwie vergleicht der die Variable $Layout1 nicht richtig mit dem Wert "L1".

Soweit ich weiss, wird doch der Block an Anweisungen in der {}-Spitzen Klammer ausgeführt, wenn der If-Teil zutrifft. Das Script führt aber den in den Spitzklammern enthaltenen Block _immer_ aus. Warum?

Gute Nacht Gary

  1. Hallo gary!

    if($Layout1 == "L1") {
    Irgendwie vergleicht der die Variable $Layout1 nicht richtig mit dem Wert "L1".

    Argument is not numeric...

    Du solltest Dir den Abschnitt über die Operatoren noch mal durchlesen, insbesondere die Vergleichsoperatoren.

    Viele Grüße aus Frankfurt/Main,
    Patrick

    --

    _ - jenseits vom delirium - _
    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    Nichts ist unmöglich? Doch!
    Heute schon gegökt?
    1. Hi Patrick,

      Du Held der Arbeit, schon so früh wach?

      Da hattes Recht. Es war schlicht und ergreifend eq für equal. In Basic-Zeiten hatte ein simples = ausgereicht.

      Grüsse und Dank gary

      1. Hallo gary!

        Du Held der Arbeit, schon so früh wach?

        Diese Woche: Montag, Mittwoch und Freitag, nächste Woche: Dienstag und Donnerstag, dann wieder. Die Kleine hat »Gartenprojekt«, sie muss früher in den Kindergarten und Onkel P. ist deswegen auch früh auf.

        Da hattes Recht. Es war schlicht und ergreifend eq für equal. In Basic-Zeiten hatte ein simples = ausgereicht.

        Keine Ahnung von Basic. In den Sprachen, die ich kenne, ist der einfache Istgleich-Zeichen der Zuweisungsoperator.

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --

        _ - jenseits vom delirium - _
        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Nichts ist unmöglich? Doch!
        Heute schon gegökt?
  2. Guten Abend,

    Guten Morgen.

    Ich habe eine CSV-Datei die sieht so aus:
    [...]
    Und eine Perl-Abfrage, die sieht so aus:

    Oje ;)

    Ich schreib Dir mal, wie ich es machen würde:

    # Namen der CSS-Klassen  
    my %classes = ( 'L1' => 'inner_left_links',  
                    'R1' => 'inner_left_right',  
                    'O1' => 'inner_left_oben',  
                    'U1' => 'inner_left_unten'  
                   );  
      
    my $file = 'public/publisher.csv';  
      
    print "Content-type: text/html\n\n";  
    open LESER, $file or die "Couldn't open $file: $!";  
    flock LESER, LOCK_SH;  
      
    # zeilenweise einlesen  
    while(<LESER>);  
      # aktuell gelesene Zeile splitten  
      my @fields = split /,/;  
      # DIV-Element mit der zutreffenden CSS-Klasse bestuecken  
      print qq/<div class='$classes{$fields[0]}'>\n/;  
      # Feld 2 bis n der aktuellen Zeile ausgeben  
      print @fields[1..$#fields], "\n";  
    }  
    close LESER;  
      
    print qq/</div>\n/;
    

    <disclaimer>Runtergetippt und ungetestet, Tippfehler bitte ich nachzusehen :)</disclaimer>

    Nur müsste nach diesem Script die Div-Klassen nur zweimal im Quelltext der Shtml-Seite auftauchen- statt acht mal. Irgendwie vergleicht der die Variable $Layout1 nicht richtig mit dem Wert "L1".

    Siehe PAFs Posting.

    Siechfred

    --
    Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
    1. Hallo Siechfred!

        
      
      > print qq/<\/div>\n/;
      
      

      ^ ^     ^

      Nur der Richtigkeit halber ;)

      Siehe PAFs Posting.

      Ob Gary weiß, dass ich mal PAF war? ;)

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      Nichts ist unmöglich? Doch!
      Heute schon gegökt?
      1. Re!

        Grummel, Mistformatierung bei gehighlighteted Code, Sakra...
        Die Pfeilchen sollte auf die »/« verweisen...

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --

        _ - jenseits vom delirium - _
        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Nichts ist unmöglich? Doch!
        Heute schon gegökt?
    2. Morgen Siefred,

      Ich schreib Dir mal, wie ich es machen würde:

      Ja, so geht das aber für meine Zwecke nicht, denn ich mus den Inhalt dynamisch haben. Nicht die CSV soll in die Shtml, sondern die Datei, welche in der csv genannt ist. Das erfordert einen Schichtweisen Aufbau.

      Aber ich bin bald fertig, dann zeig ich dir, wie das gemeint ist :-)

      Viele Grüsse gary

      PS.:Nichts deto Trotz, hast du mir damit einen tollen "Kniff" gezeigt ;-)

      1. Ja, so geht das aber für meine Zwecke nicht, denn ich mus den Inhalt dynamisch haben. Nicht die CSV soll in die Shtml, sondern die Datei, welche in der csv genannt ist.

        IO::All.

        Siechfred

        --
        Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
  3. Und eine Perl-Abfrage, die sieht so aus:

    Solange du nicht auf Hilfe eingehst, die keine Meldungen von Perl anzeigen lassen willst (auch die Warnungen lassen sich anzeigen), ist jede weitere Beantwortung deiner Fragen sinnlos.

    Struppi.

    1. Morgen Struppi,

      Habe dir unten im anderen Thread geantwortet.

      Dieser Thread ist gelöst!

      Danke an alle...

      Viele Grüsse gary

      1. Hallo zusammen,

        Ich bin fertig mit dem Perlprog. Jetzt kann man in der publisher.csv bestimmen, welcher Bericht, mit welchem Layout angezeigt wird:

        publisher.csv:

        L,rauchen.txt,rauchen.png <--bedeutet Text steht links(L), Bild dann rechts
        R,auto.txt,auto.png       <--bedeutet Text steht rechts(R), Bild dann links
        O,strom.txt,strom.png     <--bedeutet Text steht oben(O), Bild dann unten
        U,urlaub.txt,urlaub.png   <--bedeutet Text steht unten(U), Bild dann oben

        Ausserdem können jetzt Berichte geschrieben werden und ein Foto zum Bericht auf dem Server in vorgesehene Ordner abgelegt werden:

        sammler/artikel_text/bericht.txt
        sammler/artikel_pics/bericht.png

        Das Script paßt sich der Länge der Publikationen automatich an.

        So sieht es jetzt aus (Nicht über den Inhalt mekern, ist nur blabla zum Testen).

        Eines hätte ich noch:
        Ganz, ganz klasse wäre, wenn man den bericht.txt als Block verfassen könnte, nicht in einer Linie. Dafür müssete aber der Dateileser nach dem auslesen alle Umbrüche entfernen.

        Zum Schluß noch das ultimative Layoutprogramm:

        #!/usr/bin/perl -w

        ###############################################################################

        DecisionMaker:                   Version 1.00                               #

        Developed started in:            22.05.2008                                 #

        Finished in:                     28.05.2008                                 #

        Programmed by:                   Gary-Technologies                          #

        ###############################################################################

        my $Layout1;
        my $Thema;
        my $Bild;
        open(LESER, "<public/publisher.csv");
        flock(LESER, LOCK_SH);

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

        while(! eof(LESER)){

        my $zeile = <LESER>;
        my ($Layout1, $Thema, $Bild) = split(/,/,$zeile);

        if($Layout1 eq "L") {
        print "<!-- ############################### -->\n";
        print "<!-- #Das ist die Klasse Text Links# -->\n";
        print "<!-- ############################### -->\n";
        print "\n";
        print '<div class="inner_left_links">',"\n";
        print '<p class="report">';
        open(INHALT, "<../httpdocs/sammler/artikel_text/$Thema");
        flock(INHALT, LOCK_SH);
        $insert = <INHALT>;
        close(INHALT);
        print $insert;
        print "</p>\n";
        print "</div>\n";
        print '<div class="inner_right_links">',"\n";
        print '<img src="sammler/artikel_pics/';
        print $Bild;
        print '" alt="">',"\n";
        print "</div>\n";
        }

        if($Layout1 eq "R") {
        print "<!-- ################################ -->\n";
        print "<!-- #Das ist die Klasse Text Rechts# -->\n";
        print "<!-- ################################ -->\n";
        print "\n";
        print '<div class="inner_left_rechts">',"\n";
        print '<img src="sammler/artikel_pics/';
        print $Bild;
        print '" alt="">',"\n";
        print "</div>\n";
        print '<div class="inner_right_rechts">',"\n";
        print '<p class="report">';
        open(INHALT, "<../httpdocs/sammler/artikel_text/$Thema");
        flock(INHALT, LOCK_SH);
        $insert = <INHALT>;
        close(INHALT);
        print $insert;
        print "</p>\n";
        print "</div>\n";
        }

        if($Layout1 eq "O") {
        print "<!-- ############################## -->\n";
        print "<!-- #Das ist die Klasse Text Oben# -->\n";
        print "<!-- ############################## -->\n";
        print "\n";
        print '<div class="inner_up_oben">',"\n";
        print '<p class="report">';
        open(INHALT, "<../httpdocs/sammler/artikel_text/$Thema");
        flock(INHALT, LOCK_SH);
        $insert = <INHALT>;
        close(INHALT);
        print $insert;
        print "</p>\n";
        print "</div>\n";
        print '<div class="inner_down_oben">',"\n";
        print '<img src="sammler/artikel_pics/';
        print $Bild;
        print '" alt="">',"\n";
        print "</div>\n";

        }

        if($Layout1 eq "U") {
        print "<!-- ############################### -->\n";
        print "<!-- #Das ist die Klasse Text Unten# -->\n";
        print "<!-- ############################### -->\n";
        print "\n";
        print '<div class="inner_up_unten">',"\n";
        print '<img src="sammler/artikel_pics/';
        print $Bild;
        print '" alt="">',"\n";
        print "</div>\n";
        print '<div class="inner_down_unten">',"\n";
        print '<p class="report">';
        open(INHALT, "<../httpdocs/sammler/artikel_text/$Thema");
        flock(INHALT, LOCK_SH);
        $insert = <INHALT>;
        close(INHALT);
        print $insert;
        print "</p>\n";

        }

        }

        close(LESER);

        Wer will darf es nutzen! Ich gebe es als Open-Source frei ;)

        Grüsse gary

        1. Hallo gary,

          So sieht es jetzt aus (Nicht über den Inhalt mekern, ist nur blabla zum Testen).

          Bis zum validen Code ist es nur noch ein kleines Stück...

          thebach

          --
          selfcode: ie:% fl:( br:> va:) ls:& rl:( n4:~ ss:| de:> js:( ch:? mo:} zu:)
          "Egal, ob ein Sandkorn oder ein Stein. Im Wasser sinken sie beide."
          1. Hi thebach,

            Bis zum validen Code ist es nur noch ein kleines Stück...

            OK, aber jetzt! (bis auf die byte order warnung - was immer das sein soll *g*

            Gruss gary

            1. OK, aber jetzt! (bis auf die byte order warnung - was immer das sein soll *g*

              Das erklärt auch die nicht funktionierenden Perlskripte. Du speicherst deine Dateien immer noch im UTF Format mit BOM ab, das kann ja nichts werden. Aber das hatten wir ja schon.

              Struppi.

              1. Nein, das PerlScript ist in .txt/Textdocument gespeichert. Lediglich die einzufügende Texte und die Shtml-Seite ist in utf-8 gespeichert.

                Grüsse gary

                1. Nein, das PerlScript ist in .txt/Textdocument gespeichert. Lediglich die einzufügende Texte und die Shtml-Seite ist in utf-8 gespeichert.

                  Ja deins, war ja lange Thema, aber wie sieht es mit dem Code den ich dir gezeigt hatte aus? Die Rechte hattest du auch richtig gesetzt?

                  Struppi.

                  1. Hi Struppi,

                    Ja deins, war ja lange Thema, aber wie sieht es mit dem Code den ich dir gezeigt hatte aus? Die Rechte hattest du auch richtig gesetzt?

                    Ähmmmmm, nein! *schluck*. Habe jetzt dein Use-Test auf 755 gestellt und es sagt:

                    http://www.vam-shop.com/cgi-bin/Use-Test.pl

                    Ist das gut oder schlecht?

                    Grüsse gary

                    PS:Bitte um Begnadigung. (Wenns geht nicht Standrechtlich erschiessen!"

                    1. Hallo gary!

                      Ähmmmmm, nein! *schluck*. Habe jetzt dein Use-Test auf 755 gestellt und es sagt:

                      Na siehst Du. Aber den Fehler aufs Vorhandensein von »use« oder »die« zu schieben (Zitat: _mein Perl_ mag kein »use«)...

                      http://www.vam-shop.com/cgi-bin/Use-Test.pl
                      Ist das gut oder schlecht?

                      Das beweist, dass das CGI-Modul erfolgreich eingebunden wird, also dass »use« nicht die Ursache war, dass Deine Skripte abbrachen - genauso wenig wie »die«.

                      PS:Bitte um Begnadigung. (Wenns geht nicht Standrechtlich erschiessen!"

                      Ich habe schon mit Bush telefoniert, dass er Dich abholen läßt für Guantanamo.

                      Viele Grüße aus Frankfurt/Main,
                      Patrick

                      --

                      _ - jenseits vom delirium - _
                      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                      Nichts ist unmöglich? Doch!
                      Heute schon gegökt?
        2. Ich bin fertig mit dem Perlprog.

          Ich bin frustriert. Du programmierst prozedural, ist ja an sich nichts schlechtes. Aber das, was rauskommt, ist Cargo cult programming. Sorry, dass ich das so hart sage, aber Du beherzigst keinen der zahlreichen Tipps, die Du bekommen hast: Kein strict-Pragma, kein Einsatz von Standardmodulen, kein Abfangen von Fehlern, redundanter Code ... Schade.

          Siechfred

          --
          Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
          1. Hi Siefred,

            Cargo cult programming.

            Stimme ich nur bedingt zu. Ich verstehe sehr wohl die einzelnen Schritte, die ich da zusammengebaut habe. Und auch Kommentare sind vorhanden. Das die Fehlerausgabe noch fehlt, ist ein kleineres übel. Auch der fehlende Div-Tag ist nachträglich eingebaut worden.

            Mir vorzuwerfen, ich nutze keine Module halte ich nicht für angebracht. Im Gegenteil. Bevor man an die Nutzung von Modulen denkt, sollte man zuerst einmal das "nackte" Perl an sich verstehen bzw. erlernen. Module haben noch einen Nachteil. Sind sie nicht installiert, kann man sie nicht nutzen.

            Ihr seid doch sonst so strikt gegen JavaScript, Flash und Konsorten wegen der "angeblichen" Barrierefreiheit (wobei JavaScript als Standard anzusehen ist). Nutze ich nun Perl "nackig", wird mir dass nun hier zur Last gelegt. Ja wie jetzt nun? :-)

            Viele Grüsse gary

            1. Mir vorzuwerfen, ich nutze keine Module halte ich nicht für angebracht. Im Gegenteil. Bevor man an die Nutzung von Modulen denkt, sollte man zuerst einmal das "nackte" Perl an sich verstehen bzw. erlernen. Module haben noch einen Nachteil. Sind sie nicht installiert, kann man sie nicht nutzen.

              Das ist Quark, hab ich dir aber auch schon mal erklärt. Perl ohne Module ist fast nichts und es gehören sehr viele zu jeder Standardinstallation. Das installieren von Modulen ist eine der grundlegenden Techniken die man beherschen sollte, wenn man mit Perl programmiert.
              Es gibt auch kaum einen Hoster wo nicht DBI, GD oder ähnliche Module installiert sind, da diese schon deshalb benötigt werden um die gleichen Sachen machen zu können wie mit PHP.

              Ihr seid doch sonst so strikt gegen JavaScript, Flash und Konsorten wegen der "angeblichen" Barrierefreiheit (wobei JavaScript als Standard anzusehen ist). Nutze ich nun Perl "nackig", wird mir dass nun hier zur Last gelegt. Ja wie jetzt nun? :-)

              Das ebenfalls, kaum einer ist strikt gegen diese Techniken, nur wenn man sie so einsetzt, dass sie eine Barriere sind, dann sollte man sicher sein was man tut. Das nackte Perl ist eine Riesenbarriere, allerdings für dich. Du hast einen supertollen Motor, willst aber keine Räder dran machen und trägst ihn stattdessen.

              Struppi.

            2. Das die Fehlerausgabe noch fehlt, ist ein kleineres übel.

              Nein, das ist m.E. ein Hauptübel.

              Mir vorzuwerfen, ich nutze keine Module halte ich nicht für angebracht.

              Dann mach es wie vorgeschlagen und programmiere Deine Webseite in Assembler. Es ist eine der Stärken von Perl, dass Du auf eine Vielzahl von Modulen zurückgreifen kannst, die Dir die Arbeit ungemein erleichtern.

              Im Gegenteil. Bevor man an die Nutzung von Modulen denkt, sollte man zuerst einmal das "nackte" Perl an sich verstehen bzw. erlernen.

              Grundsätzlich keine schlechte Idee. Aber man sollte sich auch sinnvolle Aufgaben stellen, meine ich. HTML-Code mit Perl auszugeben, ist Pillepalle, dafür gibt es das CGI-Modul. Dynamische Webseiten zu erstellen bedeutet schlussendlich, HTML-Code auszugeben. Wozu SSI nutzen, wenn HTML::Template existiert? Du verzettelst Dich in Nichtigkeiten (z.B. gibst Du 4 Mal fast identisches HTML aus - wenn das nicht redundant ist, was dann?) und vernachlässigst Grundlagen, die für einen Anfänger unerlässlich sind (strict-Pragma, Fehlerbehandlung).

              Module haben noch einen Nachteil. Sind sie nicht installiert, kann man sie nicht nutzen.

              Perl bietet Dir eine Fülle an Standardmodulen. Damit sind 99% der Anwendungsfälle abgedeckt. Ich behaupte, dass man Deine gefühlten 100 Zeilen Code auf gefühlte 10 Zeilen reduzieren könnte. Dabei würdest Du mehr über Perl lernen, als Du bei den 100 Codezeilen gelernt hast (eigene Erfahrung, ich habe ja auch mal so wie Du angefangen). Das, was Du jetzt hast, ist der schnelle Erfolg, der Dich aber nicht wirklich weiterbringt. Nimm Dein Script, druck' es Dir aus, rahme es und hänge es Dir als "Mein erstes Perlscript" an die Wand. In ein paar Monaten wirst Du Dich dieses Scriptes schämen (wenn Du in meinen Giftschrank sehen könntest ... ;) ).

              Ihr seid doch sonst so strikt gegen JavaScript, Flash und Konsorten wegen der "angeblichen" Barrierefreiheit (wobei JavaScript als Standard anzusehen ist).

              Perl ist eine Passionsfrucht, Javascript ein Apfel und Flash, naja ... ähm ... Ingwer ;)

              Nutze ich nun Perl "nackig", wird mir dass nun hier zur Last gelegt.

              Da verstehst Du mich falsch. Mich hat frustriert, dass Du trotz mehrfacher Hinweise weiterhin Anfängerfehler machst. Gewöhne Dir von Anfang an einen guten Programmierstil an (egal, ob Perl, PHP, Javascript oder Brainfuck) und verzichte auf den schnellen Erfolg, dann wirst Du es später viel einfacher haben.

              Siechfred

              --
              Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.