in reply to Alignment Program

The modules mentioned in other responses here will provide you with a robust solution. But if the problem itself interests you, here's a way to approach the task using a lot less code. (I have omitted the hyphenation bit since I don't quite follow your standards for that part).

This approach creates a closure (roughly stated: a state-preserving anonymous subroutine) which you then call to spit out a word at a time for handling. This allows your main loop to focus on building the new lines and to ignore the details of parsing the input and knowing when to read in another line.

#!/usr/bin/perl -w use strict; sub make_word_dispensor { my $infile = shift; open INFILE, "<$infile" or die "Can't open $infile: $!\n"; my @words = (); return sub { unless (@words or (@words = split /\s/, <INFILE>)) { close INFILE; return undef; } return shift @words; } } my $word_dispensor = make_word_dispensor("test.txt"); my $line_length = 50; my $line = ''; while (my $word = &$word_dispensor()) { if (length("$line $word") > $line_length) { print "$line\n"; $line = $word; } else { $line .= ($line ? ' ' : '') . $word; } } print "$line\n";

Season to taste. HTH

Replies are listed 'Best First'.
Re: Re: Alignment Program
by Anonymous Monk on May 27, 2001 at 00:08 UTC
    Thanks. I'll explain the hypenation standard, if it interests anyone:
    elsif ( (($sCount > $words) and ($wLength-($sCount-2) > 3)) )
    First, I see is the space I need to fill is more than the number of words on the line; that is to say, if putting a space between each word would still leave spaces to be filled(so I don't have too many spaces in the file). Moving on. The main point of this expression is just so you won't get text like this:
    This is a line of code, o- r is it?