pugsly62 has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I'm pretty new at perl, but you guys and gals have been exremely helpful thus far - thanks!!!

I'm trying to format the output from each of the 4 statements below so that they're final format is on one page in columns(i.e. ,

2001 2002 2003 2004 yr_01 yr_02 yr_03 yr_04 yr_01 yr_02 yr_03 yr_04,etc).

I can print the output from the first statement but if I print the output for all 4 statements it mixes all 4 together, which is not what I want. I want each year in a separate column.

I know how to use write function to format( i.e. @<<<< ) but I'm having trouble temporarily saving these 4 outputs as separate variables that I can write to the final report. Do I have to write these outputs to temporary files?

Thanks!

Scott

#!/gov/ecf/bin/perl -w use strict; use warnings; my $records = 'scott.d3'; my $FhIn; open $FhIn, '<', $records or die "Could not open $records: $!"; while( my $line = <$FhIn> ) { my ( $county, $year_x, $yr_tot ) = split ' ', $line; if ( $year_x eq "1" ) { $year_x += $yr_tot; print "$county $yr_tot\n"; } elsif ( $year_x eq "2" ) { $year_x += $yr_tot; } elsif ( $year_x eq "3" ) { $year_x += $yr_tot; } elsif ( $year_x eq "4" ) { $year_x += $yr_tot; } } close $FhIn or die $!;

20050207 Janitored by Corion: Added formatting

Replies are listed 'Best First'.
Re: formatting output
by hsinclai (Deacon) on Feb 07, 2005 at 23:02 UTC
    pugsly62 you could apply the principle here to your code ..
    #!/usr/bin/perl -w use strict; my $key; my $formatted_text = &format_me; print $formatted_text; sub format_me { my $pair; open BLOCKSTRUCTURE, '>', \$pair; foreach $key ( sort keys %ENV ) { write BLOCKSTRUCTURE; } format BLOCKSTRUCTURE = @<<<<<<<<<<<<<<<<<<<<<<<<<< value -> @<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +<<<<<<<<<<<< $key, $ENV{$key} . return $pair; }

    This formats the data in %ENV (the hash holding Perl's view of the system environment) into two columns - you don't have to write a disk file - you can hold format()'ed blocks of data like columns in a scalar variable!! (must be using Perl 5.8 or later)

    update: Forgot to mention: the trick there is to "write" to a HANDLE (which instead of writing to a file, writes to a scalar), and create a format statement called HANDLE (format and handle names identical). I would take a stab at your desired output but don't see where you print $county in your desired output example..

Re: formatting output
by hsinclai (Deacon) on Feb 08, 2005 at 03:30 UTC
    I still don't understand what your input data might look like, but is this closer to your output example?

    #!/usr/bin/perl -w use strict; use warnings; my ( $county, $year_x, $yr_tot, $production ); my $result = &make_table; print $result; sub make_table { open YEARLY, '>', \$production; print YEARLY " 2001 2002 2003 2004 \n"; while ( <DATA> ) { ( $county, $year_x, $yr_tot ) = split ' ', $_; if ( $year_x eq "1" || "2" || "3" || "4" ) { $year_x += $yr_tot; write YEARLY; } } return $production; } format YEARLY = @<<<<<<<< @<<<< $county, $year_x . close YEARLY; __DATA__ McMahon 1 9000 McHardy 2 8000 Moonlit 3 7000 Murphie 4 6000

    Returns:
    2001 2002 2003 2004 McMahon 9001 McHardy 8002 Moonlit 7003 Murphie 6004


    No writing to a disk file until you need to...
Re: formatting output
by perlsen (Chaplain) on Feb 08, 2005 at 04:49 UTC

    Hi, Just try this

    @year = ('2001', '2002', '2003', '2004'); $~ = "years"; write; format years = ==================================== @<<<<<< @<<<<<< @<<<<<< @<<<<<< @year ==================================== . format design = @<<<<<< @<<<<<< @<<<<<< @<<<<<< @arr . while (<DATA>) { @arr = split(/\t/, $_); $~ = "design"; write; } __DATA__ yr_01 yr_02 yr_03 yr_04 yr_01 yr_02 yr_03 yr_04 yr_01 yr_02 yr_03 yr_04 yr_01 yr_02 yr_03 yr_04 yr_01 yr_02 yr_03 yr_04 output ************** ==================================== 2001 2002 2003 2004 ==================================== yr_01 yr_02 yr_03 yr_04 yr_01 yr_02 yr_03 yr_04 yr_01 yr_02 yr_03 yr_04 yr_01 yr_02 yr_03 yr_04 yr_01 yr_02 yr_03 yr_04