in reply to regexp question

You can try this
grep { push(@arr,substr($_,0,19)) } split (" ",$string); print join("\n",@arr);

Replies are listed 'Best First'.
Re^2: regexp question
by ww (Archbishop) on Dec 29, 2006 at 14:31 UTC
    I may have missed something, but...
    $string = "now is the time for all good men to come to the aid of thei +r country while the gratuitously extralongwordwithmorethantwentychara +ctersexdtendson and on."; grep { push(@arr,substr($_,0,19)) } split (" ",$string); print join("\n",@arr);
    prints:
    now
    is
    the
    time
    for
    all
    good
    men
    to
    come
    to
    the
    aid
    of
    their
    country
    while
    the
    gratuitously
    extralongwordwithmo ###1
    and
    on.
    
    while tfoertsch's "this works for me"
    while ( $string =~ /(\S.{0,19})(?=\s|$)/g ) { # NB: "=~" here, rather than a simple "=" in original. push(@arr, $1); } for my $arr(@arr) { print $arr . "\n"; }
    prints:
    now is the time for
    all good men to come
    to the aid of their
    country while the
    gratuitously
    charactersexdtendson  ###2
    and on.
    

    Note that tfoertsch's output does most of what's specified in the OP, BUT both ###1 and ###2 truncate the "extra long word;" one from the head and one from the tail. That's a problem only if the source data can't be relied upon to use words of more ordinary length. In non-technical English, this isn't likely to be a problem, but I wouldn't want to bet on this auf Deutsch or any of the Germanic/Low Countries/Scandanavian languages.

    Update, in light of the estimable swampyankee's comment below: This may be an example of one of the cases swampyankee had in mind when opting for split