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 |