jonny: Zeilenumbruch erzwingen oder Perl Mittel nutzen

Hallo,

gibt es einen Weg einen Zeilenumbruch in einer Tabellenspalte zu erzwingen?

Ich habe zum Beispiel einen String der so aussehen könnte:

$string="ddddddddddddddddddiiiiiiiiiiiiieeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeesssssssssssssssssssssssssss iiiiiiiiiiiiiiiissssssssssssssssssttttttttttttttt eeeeeeeeeeeeeeiiiiiiiiiiiiinnnnnnnnnn tttttttttttteeeeeeeeessssttttttttttt!"

Nun möchte ich aber nicht, dass sich die Spalte bis auf's verderben ausbreitet, sondern schon 300px breit bleibt.

Oder gibt es da garnichts und sollte den String lieber in meinem Perlskript bearbeiten. Wenn ja, wie mache ich das am besten? Wie schummel ich nach 40 Zeichen einen <br> Tag ein?

Mfg,
Jonny

  1. Hallo,

    Oder gibt es da garnichts und sollte den String lieber in meinem Perlskript bearbeiten. Wenn ja, wie mache ich das am besten? Wie schummel ich nach 40 Zeichen einen <br> Tag ein?

    in Perl kannst du es so machen:

    use Text::Wrap;
    $Text::Wrap::columns = 40 # Umbruch nach 40 Zeichen
    dann die Funktion wrap(init_string, other_string, text) benutzen
    init_string := String zum Einrücken der ersten Zeile
    other_string := String zum Einrücken der folgenden Zeilen
    text := array mit Text
    Rückgabe ist ein einfacher String mit einem 'newline' am Ende jeder 'Zeile', außer bei der letzten.
    Ersetze dann noch "\n" durch "<br />".
    Beachte, das Schriftgröße und Schriftart das Ergebnis natürlich zunichte machen können! Du mußt also mit festen Schriftarten (keine Proportionalschriften) und mit absoluten Schriftgrößen arbeiten. Das ist IMO kein optimaler Weg.

    Ensprechend formatierte <span> Elemente in deinen Zellen könnten dein Problem aber möglicherweise auch lösen, wenn auch keine Wort-Trennung, -Aufspaltung bewerkstelligen.

    cu,
    ziegenmelker

    1. Hallo,

      von Text::Wrap habe ich auch schon gelesen.

      Das ist IMO kein optimaler Weg.

      Ich habe jetzt mal fleißig gesucht und das hier testweise angewendet:

      my $string="DiesisteinTest!";
      $string=~s/(.{7})/\1<br>/;
      print "$string\n";

      Diesist<br>ein Test!

      Wie findest du das? Wäre das ok oder zu umständlich?

      Mfg,
      Jonny

      1. Hallo nochmal Ziegenmelker,

        jetzt weiß ich nicht so recht, ob ich mich selber übertroffen habe.

        my $string="DiesisteinTest!";
        $string=~s/(.{7})/\1<br>/;
        print "$string\n";

        Diesist<br>ein Test!

        my $string="DiesisteinTest!DiesisteinTest!DiesisteinTest!DiesisteinTest!DiesisteinTest!DiesisteinTest!";
        $string=~s/(.{15})/\1<br>/g;
        print "$string\n";

        DiesisteinTest!<br>DiesisteinTest!<br>DiesisteinTest!<br>DiesisteinTest!<br>DiesisteinTest!<br>DiesisteinTest!<br>

        Habs g drangehangen und es funzt. Wie gesagt, jetzt ist nur noch die Frage, ob es auch eine sinnvolle - komfortable - Lösung ist.

        Mfg,
        Jonny

        1. Hallo jonny,

          Habs g drangehangen und es funzt. Wie gesagt, jetzt ist nur noch die Frage, ob es auch eine sinnvolle - komfortable - Lösung ist.

          sieht gut aus :)
          So ist es sicher auch sinnvoll, ich frage mich nur was du unter komforabel, im Zusammenhang mit Programmieren, verstehst?

          cu,
          ziegenmelker

          1. Hiho,

            sieht gut aus :)
            So ist es sicher auch sinnvoll, ich frage mich nur was du unter komforabel, im Zusammenhang mit Programmieren, verstehst?

            was schneller ist, performanter, leistungsfähiger, aber vorallem auch was üblich ist, allgemeingebräuchlich :-)

            Mfg,
            Jonny

            1. Hallo jonny,

              So ist es sicher auch sinnvoll, ich frage mich nur was du unter komforabel, im Zusammenhang mit Programmieren, verstehst?

              was schneller ist, performanter, leistungsfähiger, aber vorallem auch was üblich ist, allgemeingebräuchlich :-)

              Schneller ist wahrscheinlich eine Konstruktion mit einer Schleife, denn die Interpreter haben vermutlich mehr Arbeit beim Checken einer regex als beim Interpretieren z.B. einer while-Schleife. Das kannst du ja mal mit einem wirklich _großen_ string testen. ;)
              Wobei klar ist, daß die regex nur einmal kompiliert wird!
              Eleganter wäre eine rekursion, aber bei großen strings auch gefährlich (Speicherplatz).
              Reguläre Ausdrücke werden von Perl-Proggern gerne benutzt, die Wartbarkeit des codes ist da aber vielleicht schon eine andere Frage.
              Die Frage nach der Performance tritt IMO erst dann in den Vordergrund, wenn ein Programmteil häufig aufgerufen wird, oder selbst aufgrund der Datenmengen lange Laufzeiten generiert. Oder auch generelle Designfehler, z.B. schlecht geplante Datenbanken, die dann aufwendige, (ja ich hasse die neue Deutsche Rechschreibung) und dadurch langsame Abfragen erzwingen.

              Wenn z.B. bei deinem Beispiel die Daten aus einer DB kommen, dann würde ich sie dort schon fertig formatiert ablegen, was dann beim Seitengenerieren entsprechend (Perl-) Zeit spart.

              cu,
              ziegenmelker

              1. Hallo nochmal,

                Die Frage nach der Performance tritt IMO erst dann in den Vordergrund, wenn ein Programmteil häufig aufgerufen wird

                jo, ca. 12000 Mal für ca. 8 Spalten mit Strings, die bis zu 1000 Zeichen lang sein können.

                Wenn z.B. bei deinem Beispiel die Daten aus einer DB kommen, dann würde ich sie dort schon fertig formatiert ablegen, was dann beim Seitengenerieren entsprechend (Perl-) Zeit spart.

                Das geht leider nicht. Perl muss da leider zur Sache kommen, denn ein Performance Monitor soll nicht unbedingt selber große Last erzeugen. Ich mache mein select und "verzieh" mich dann wieder, Perl muss filtern und schneiden.

                die Wartbarkeit des codes ist da aber vielleicht schon eine andere Frage

                Ich gebe mir wirklich Mühe, meine Skripte so klein wie möglich zu halten und die besten Laufzeiten zu erhalten.

                Mfg,
                Jonny

                1. Hallo jonny,

                  ich habe mal deine regex mit einer for-loop (mit substr) verglichen.
                  Die for-loop ist erwartungsgemäß ca 54% schneller (18,5sec zu 10sec).

                  cu,
                  ziegenmelker

                  1. ich habe mal deine regex mit einer for-loop (mit substr) verglichen.
                    Die for-loop ist erwartungsgemäß ca 54% schneller (18,5sec zu 10sec).

                    cu,
                    ziegenmelker

                    cu? nix da!

                    her mit der Testreihe! Schieb mir mal die Scripts rüber bitte...

                    das Interessiert mich wirklich!

                    Mfg,
                    Jonny

                    1. Hallo,

                      Die for-loop ist erwartungsgemäß ca 54% schneller (18,5sec zu 10sec).

                      hier muß ich mich korrigieren (war noch ein bug drin), es sind 19 zu 15 sec bei einfachen strings. Bei arrays(Listen) ist die Sache noch was komplizierter (es gibt mehr Möglichkeiten).

                      her mit der Testreihe! Schieb mir mal die Scripts rüber bitte...

                      das Interessiert mich wirklich!

                      Wenn ich alles durch habe schicke ich dir das script per mail.

                      cu(mfg),
                      ziegenmelker

                      p.s. du weißt was 'cu' heißt?

                      1. Hi,

                        Wenn ich alles durch habe schicke ich dir das script per mail.

                        Klasse! Dann hast du einen Gut bei mir!

                        Mfg,
                        Jonny