Dan wrote:
> 
> ok, this probably has an easy answer, but yet i can't think of it. i want
> to create a "table", not a table in html, otherwise this would be so easy,
> but it's not. the idea is, i have variable length data, and i want to be
> able to create a table out of it, if i give you a sample, and show how i'd
> want perl to output it, any ideas?
> 
> sample data:
> 1 Erazor 100 0 0
> 2 AnGeL` 500 0 0
> 4 ^ML^ 100 0 0
> 5 Joe 100 0 1
> 6 Liquid_Snake_911 100 0 0
> 121 Psycho 100 0 0
> 
> and i'd want the data to be outputted in this format (it'll be displayed
> using fixed width text):
> 
> --------------------------------------------------
> | ID  | Nickname         | ULEVEL | SLEVEL | AOP |
> |-----|------------------|--------|--------|-----|
> | 1   | Erazor           |  100   |   0    |  0  |
> | 2   | AnGeL`           |  500   |   0    |  0  |
> | 4   | ^ML^             |  100   |   0    |  0  |
> | 5   | Joe              |  100   |   0    |  1  |
> | 6   | Liquid_Snake_911 |  100   |   0    |  0  |
> | 121 | Psycho           |  100   |   0    |  0  |
> --------------------------------------------------
> 
> but for example, if "Liquid_Snake_911" wasn't there, the table would look like:
> 
> ------------------------------------------
> | ID  | Nickname | ULEVEL | SLEVEL | AOP |
> |-----|----------|--------|--------|-----|
> | 1   | Erazor   |  100   |   0    |  0  |
> | 2   | AnGeL`   |  500   |   0    |  0  |
> | 4   | ^ML^     |  100   |   0    |  0  |
> | 5   | Joe      |  100   |   0    |  1  |
> | 121 | Psycho   |  100   |   0    |  0  |
> ------------------------------------------
> 
> so the column is either (length of the title + 2) or
> (length of largest record + 2).
> 
> any clues on how this may be acheived?


Here is one way to do it:

#!/usr/bin/perl -w
use strict;

my @header = qw/ID Nickname ULEVEL SLEVEL AOP/;
my @widths = map length, @header;
my @data;

while ( <DATA> ) {
    push @data, [ split ];
    for ( 0 .. $#{$data[-1]} ) {
        $widths[$_] = length $data[-1][$_]
            if $widths[$_] < length $data[-1][$_];
        }
    }

my $total  = do { my $t; $t += $_ for @widths; $t };
my $format = join( '', map( "| %-${_}s ", @widths ) ) . '|';
my $line   = '-' x ( $total + @widths * 3 + 1 );

print  "$line\n";
printf "$format\n", @header;
print  "$line\n";
printf "$format\n", @$_ for @data;
print  "$line\n";

__DATA__
1 Erazor 100 0 0
2 AnGeL` 500 0 0
4 ^ML^ 100 0 0
5 Joe 100 0 1
6 Liquid_Snake_911 100 0 0
121 Psycho 100 0 0




John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to