Hein: Hilfe! Ich brauche mal den geschulten Blick eines "Experten"!!

Könnte mal bitte jemand kurz diesen Teil meines Skripts durchschauen? Mein Problem ist unter http://www.realschule-roxel.de/gaestebuch.html zu sehen. Tragt einfach mal ein richtig langes Wort ein, dann stretched sich die ganze Tabelle in alle Richtungen! Ich glaube das folgender Part des Skripts dies eigendlich verhindern sollte, tuts aber leider nicht! #####

function trim

trim words that are certain size in length

sub trim {

my $string = shift;
 my @sentence = split(/\s+/,$string);
 my $j = 0;
   my $word_length_max = 40;
 foreach $word (@sentence) {
  my $s_length = length($word);
  if ($s_length > $word_length_max) {
          my $num = int($s_length / $word_length_max);
          for ($i=0;$i<$num;$i++) {
             $sentence[$j] = substr($word,0,$word_length_max-1) . '-';
         $j++;
    }
    $char_index += $word_length_max;
          $sentence[$j] = substr($word,0,-1);
      $j++;
  }
  else {
         $sentence[$j] = $word;
   $j++;
  }
 }

$string = join(" ",@sentence);
 return $string;

}
Weiss jemand warum nicht? Ich wäre für einen Tip sehr dankbar!!
HEnning

  1. Hi,

    wäre es nicht am einfachsten das <input> auf eine zeichenlänge zu limitieren mit "maxlength=40" im html-code??

    dann kann man nur 40 zeichen eingeben.

    oder ist das zu simple?

    DerPilz

    1. Hi,

      wäre es nicht am einfachsten das <input> auf eine zeichenlänge zu limitieren mit "maxlength=40" im html-code??

      dann kann man nur 40 zeichen eingeben.

      oder ist das zu simple?

      DerPilz

      Das würde zwar was bringen, allerdings die Nutzungsmöglichkeitne dieses ansonsten echt guten Guestbooks unzumutbar einschränken, oder?!
      Trotzdem Danke!
      Henning

  2. Hallo

    Könnte mal bitte jemand kurz diesen Teil meines Skripts durchschauen? Mein Problem ist unter http://www.realschule-roxel.de/gaestebuch.html zu sehen. Tragt einfach mal ein richtig langes Wort ein, dann stretched sich die ganze Tabelle in alle Richtungen! Ich glaube das folgender Part des Skripts dies eigendlich verhindern sollte, tuts aber leider nicht! #####

    Was tut die Funktion denn? Was kommt hinten raus? Was steht im error_log?

    function trim

    trim words that are certain size in length

    Woher hast Du die Funktion, bzw. wer hat sie geschrieben?

    sub trim {

    my $string = shift;
    my @sentence = split(/\s+/,$string);
    my $j = 0;
       my $word_length_max = 40;
    foreach $word (@sentence) {
      my $s_length = length($word);
      if ($s_length > $word_length_max) {
              my $num = int($s_length / $word_length_max);
              for ($i=0;$i<$num;$i++) {
                 $sentence[$j] = substr($word,0,$word_length_max-1) . '-';

    ^.... hier wird in die auf den Index $j folgenden Elemente
            von @sentence incl. $j der erste Teil des gekürzten
            Wortes geschrieben. Der OFFSET für substr() wird nicht
            erhöht!?

    $j++;
        }
        $char_index += $word_length_max;
        $sentence[$j] = substr($word,0,-1);

    ^..... nun wird an die Stelle des Index $j nochmal das bis auf ein
            Zeichen gekürzte Wort in @sentence geschrieben.

    $j++;
      }
      else {
             $sentence[$j] = $word;
       $j++;
      }

    ^...... das soll wohl das nach dem zu langen Wort folgende Wort
          "dahinter" wieder einfügen. Hierbei werden aber imho
          nachfolgende Worte überschrieben.

    }

    $string = join(" ",@sentence);
    return $string;

    }

    Dieses Stück Code erzeugt - zumindest bei mir und wenn ein zu langes Wort vorkommt - eine Endlosschleife.
    Du erhöhst $j im Falle eines zu langen Wortes gleich x-mal. Dabei werden imho nachfolgende Worte durch den ersten Teil des langen Wortes überschrieben. Durch die Inkrementierung von $j wird im else-Zweig das gekürzte Wort immer noch mal "hinten" an @sentence drangehängt, nachdem es - wenn ich es richtig verstanden habe - vorher sämtliche anderen Elemente in @sentence überschrieben hat.

    Besser wäre imho, den neuen Text auch in ein neues Array zu schreiben, statt @sentence zu verlängern. Dadurch vermeidet man zumindest schon mal die Endlosschleife und einige andere Problem des obigen Codes. Wenn man kein neues Array verwenden will, sollte man wenigstens das gesplittete Wort mit splice() in @sentence einfügen.

    Imho zeugt dieser Code nicht davon, daß der Autor Perl verstanden, geschweige denn seinen eigenen Code gestestet hat. :-(

    Weitere Analysen wirst Du oder der Autor selbst durchführen müssen. Aber vielleicht stimmt ja jetzt die Richtung. :)

    Gruß Alex
    --
    http://www.google.de/search?hl=de&safe=off&q=Rechtschreibung+Standart

    1. Hallo

      [...]

      $j++;
          }
          $char_index += $word_length_max;
          $sentence[$j] = substr($word,0,-1);

      ^..... nun wird an die Stelle des Index $j nochmal das bis auf ein
              Zeichen gekürzte Wort in @sentence geschrieben.

      Es muss natürlich "... nochmal das _um_ ein Zeichen gekürzte ..." lauten.

      Neusprech: <ins>um</ins><del>bis</del> ;-)

      [...]

      Gruß Alex
      --
      http://www.google.de/search?hl=de&safe=off&q=Rechtschreibung+Standart