# 20 minute script to take a text file
# and wrap the text in it to an arbitrary
# linesize --power of perl modules

# guts from perldoc Text::Wrap
#!/usr/local/bin/perl -wT use strict; use Text::Wrap; die "\n\nusage: \n\t $0 <filename> [column width]\n" unless @ARGV==1 or @ARGV==2; open(FH,$ARGV[0]) or die "couldn't open $ARGV[0] $!"; $ARGV[0]=~ /^([-\@\w.]+)$/; # word chars only my $clean_out=$1; $clean_out eq $ARGV[0] or die "bad char in filename $ARGV[0]"; local $/= undef; # read entire file at once my @text=<FH>; close (FH); open(FH, '>',"$clean_out.wrap") or die "couldn't open ${clean_out}.wrap for writing"; $Text::Wrap::columns = $ARGV[1] || 60; print FH wrap('', '', @text); close(FH);

Replies are listed 'Best First'.
Re: textwrap of file
by simon.proctor (Vicar) on Aug 22, 2002 at 08:50 UTC
    Just a pointer but you do this:
    local $/= undef; # read entire file at once my @text=<FH>;

    The local $/ line is unncessary because you are then reading the file line by line into an array (or at least that is what you want to do). Really, you should pick what you want, to slurp or not to slurp. For example:
    my $data; open(FH,'<',$file) || die "Oops $!"; local $/ = undef; $data = <FH>; close(FH);
    Here, you now have to split up your data as you see fit. By doing what you have done, you are slurping the whole of the contents of the file into the first element of the array. To see this, run the following program on a test file and uncomment the 'local' line:
    use strict; use warnings 'all'; # Uncomment this to see what I mean # local $/ = undef; open(FH,'<',"test.txt") || die "oops: $!"; my @data = <FH>; close (FH); print $data[0];

    Ok granted that the wrap call needs an array of lines but its intelligent enough to work with lines split on \n boundaries.