use strict; use warnings; my $partLen = shift or die qq{No part length supplied\n}; die qq{Part length not integer\n} unless $partLen =~ m{^\d+$}; my $string = q{}; my $wordsFile = q{winter.txt}; open my $wordsFH, q{<}, $wordsFile or die qq{open: $wordsFile: $!\n}; { local $/; $string = <$wordsFH>; } close $wordsFH or die qq{close: $wordsFile: $!\n}; my @words = split m{\s+}, $string; my $longestWord = ( sort { $b <=> $a } map { length } @words )[0]; die qq{Part length too small to accomodate longest word\n} if $partLen < $longestWord; my @parts = (); my $part = q{}; while ( my $word = shift @words ) { $part = $word, next unless $part; if ( length($part) + length($word) + 1 > $partLen ) { push @parts, $part; $part = $word; } else { $part .= qq{ $word}; } } push @parts, $part; print qq{$_\n} for @parts;