I needed to wrap a paragraph of text to a sensible line length, as a part of one of my HTML generating scripts. Looked at the existing wrap functions and found they all required modules which may or may not be installed on the target machines. Hence, decided to do some algorithmic crunching and write my own wrap function.
# fmt("text",width); #--------------------------------------------------------------------- +- # Wraps long lines to manageable size. If a word is too long, the line # length is temporarily raised until the word does fit. sub fmt { my $text=shift; # Input text my $width=shift; # Desired width $width=70 if(!$width); # Default to 70 if omitted my $rc=""; # Return value my $cll=$width; # Current line length my $cp=0; # Current position my $i; # Index to last space. my $lot=length($text); # Length of $text. $text=~s/\s+/ /g; # Reduce all series of whitespace to o +ne while($cp+$cll < $lot) { print STDERR "cp=$cp cll=$cll\n"; while((($i=rindex($text," ",$cp+$cll))<=$cp) && $cp+$cll < $lot) { $cll+=$width; } if($i>$cp) { $rc=$rc.substr($text,$cp,$i-$cp)."\n"; $cp=$i+1; $cll=$width; } } $rc=$rc.substr($text,$cp)."\n"; return $rc; }
Use as follows:
print fmt("Type in your paragraph of text here...",40);

Replies are listed 'Best First'.
Re: Tiny little paragraph wrapper
by rnahi (Curate) on Mar 10, 2005 at 10:02 UTC

    Even without using modules, you could do it in a much simpler way:

    perl -lne 'print $1 while /(.{0,70}(?:\s|$))/g' < text_file.txt

    Just change the size of your desired line inside the regexp.

Re: Tiny little paragraph wrapper
by blahblahblah (Priest) on Mar 12, 2005 at 13:24 UTC
    Your version chops off the beginning of words that are longer than the wrap length, instead of temporarily increasing the wrap length like the original snippet does.

    For the text "Check out http://www.perlmonks.org/?node_id=438189 (it has nice line-wrapping snippet).", here is the output:

    method 1:

    Check out http://www.perlmonks.org/?node_id=438189 (it has nice line-wrapping snippet).
    method 2:
    Check out .org/?node_id=438189 (it has nice line-wrapping snippet).
      Try this regex s/(.{5,12}\s+)/$1\n/g. On the sample text it gives: :-)
      Check out http://www.perlmonks.org/?node_id=438189 (it has nice line-wrapping snippet).