But requiring a word character (\w+) will fail to trim off spaces in the case where the 45th character is a space character and the 46th character is a word character. I think my solution works correctly... can you give an example where it doesn't? Here are some boundary cases that work as they should, using one-character words as you suggested:
@words = (
# 1 2 3 4 5
#12345678901234567890123456789012345678901234567890
"The quick brown fox jumped over the lazy d I own",
"The quick brown fox jumped over the lazy do I own",
"The quick brown fox jumped over the lazy dog I own",
"The quick brown fox jumped over the lazy dogs I own",
"The quick brown fox jumped over the lazy doggy I own",
);
for my $word (@words) {
if (length $word > 45) {
my $forty_sixth = substr($word, 45, 1);
$word = substr($word, 0, 45);
$word =~ s/\s*\w*\z// if $forty_sixth =~ /\w/;
}
print "Word: '$word', Length: ", length $word, "\n";
}
produces:
Word: 'The quick brown fox jumped over the lazy d I', Length: 44
Word: 'The quick brown fox jumped over the lazy do I', Length: 45
Word: 'The quick brown fox jumped over the lazy dog', Length: 44
Word: 'The quick brown fox jumped over the lazy dogs', Length: 45
Word: 'The quick brown fox jumped over the lazy', Length: 40
|