[EMAIL PROTECTED] wrote:

> This is a code snippet from my program the prints a fixed set of column headings and 
> seperators for an array retrieved from a database. The final output for this example 
> should be: 
> 
> USER       SID,SERIAL  LOGON TIME         MODULE   ACTION         
> ~~~~       ~~~~~~~~~~  ~~~~~~~~~~         ~~~~~~   ~~~~~~     
> BILLY BOB  21,14902    08:30:00 04/10/04  XFTRYUI  Main entry form
> 
> The program achieves the first part but even after dereferencing for the line data 
> it appears I have another reference. Problems have arose because I am trying to 
> accomodate the ability to pass references to ~anonymous arrays~ as well. I'm 
> confused here and it seems I am making references to references. Do I need to 
> determine the type of reference passed to my function and then code accordingly? 

Recommended revised code at bottom.

> #!/usr/bin/perl -w
> use strict;
> 
> my @MYDATA=('BILLY BOB','21,14902','08:30:00 04/10/04','XFTRYUI','Main entry form');
> 
> &userdat_print([EMAIL PROTECTED]);
>                
> sub format_output {
>     my @maxcollength;
>     my $index;
>     my ($ary1) = $_[0]; # not understanding what purpose the ( )'s serve on left 
> side of this assignment
>     my ($ary2) = $_[1];
>     
>     foreach my $line (@$ary2) {
>      $index = 0;
>      #debug
>      #print "\n--LINE--\n";
>      foreach my $column (@$line) {
>              $maxcollength[$index] = 0 unless (defined $maxcollength[$index]);
>  
> 
>              if (length $column > $maxcollength[$index]) {
>                  $maxcollength[$index]=length $column;
>              }
>              #debug
>              #print "\nCol: " . length $column;
>              #print " Data: $column Max: $maxcollength[$index]\n";                 
>              
>              $index++;
>      }
>     }
>     $index=0;
>     foreach my $headers (@$ary1) {
>                $maxcollength[$index]=length($headers)
>                      unless (defined ($maxcollength[$index]) && 
> $maxcollength[$index] > length($headers));
>                $index++;
>     }
> 
>     my $format = "";
>     foreach my $width (@maxcollength) {
>                $format .= "  " if ($format);
>                $format .= "%-" . $width . "s";
>     }
>     return $format, @maxcollength;
> }
> 
> sub userdat_print() {
>           my $ary1 = [EMAIL PROTECTED];   #passed [EMAIL PROTECTED] array reference 
> but seem to have to reference @_.
>                             #$_[0] seems to muck things up for me the way I have 
> things coded.
>           my @mancols=('USER','SID,SERIAL','LOGON TIME','MODULE','ACTION');
>           my  @mansep=('~~~~','~~~~~~~~~~','~~~~~~~~~~','~~~~~~','~~~~~~');
>           my ($format,@colsizes)=format_output([EMAIL PROTECTED], $ary1);
>           #format_output is fine with $ary1 as is also when called from from other 
> subs and being passed
>           #anonymous array references, specifically in the second parameter.
>           
>           print sprintf "$format\n", @mancols;
>           print sprintf "$format\n", @mansep;
>           print sprintf "$format\n", @$ary1;   #problem area
> }

use strict;

my $debug = 0;
my @MYDATA = (
  ['BILLY BOB', '21,14902', '08:30:00 04/10/04', 'XFTRYUI', 'Main entry form'],
  ['Jimmy Joe', '32,25013', '09:31:01 05/11/05', 'YGUSZVJ', 'Secondary form'],
);

userdat_print ([EMAIL PROTECTED]);

exit;

#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sub userdat_print {
        my $ary1 = shift;

my @mancols = ('USER', 'SID,SERIAL', 'LOGON TIME', 'MODULE', 'ACTION');
my @mansep = ('~~~~', '~~~~~~~~~~', '~~~~~~~~~~', '~~~~~~', '~~~~~~');

my ($format, @colsizes) = format_output ([EMAIL PROTECTED], $ary1);

print "format='$format', colsizes='@colsizes'\n" if $debug;

printf "$format\n", @mancols;
printf "$format\n", @mansep;
printf "$format\n", @$_ foreach @{$ary1};

}

#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sub format_output {
        my ($ary1, $ary2) = @_;


# determine max column width for data lines

my $index = 0;
my @maxcollength;
foreach my $line (@$ary2) {

        $index = 0;
        foreach my $column (@$line) {

                my $len = length $column;
                $maxcollength[$index] = 0 unless defined $maxcollength[$index];
                if ($len > $maxcollength[$index]) {
                        $maxcollength[$index] = $len;
                }
                printf "Index: %s, Len: %s, Data: %s, Max=%s\n", $index,
                  $len, $column, $maxcollength[$index] if $debug;
                $index++;
        }
}

# determine max column width for header lines

$index = 0;
foreach my $headers (@$ary1) {
        my $len = length $headers;
        $maxcollength[$index] = $len unless (defined ($maxcollength[$index]) &&
          $maxcollength[$index] > $len);
        $index++;
}

# create printf format for each line of data

my $format = '';
foreach my $width (@maxcollength) {
        $format .= '  ' if $format;
        $format .= "%-${width}s";
}
return $format, @maxcollength;

}

__END__

-- 
  ,-/-  __      _  _         $Bill Luebkert    Mailto:[EMAIL PROTECTED]
 (_/   /  )    // //       DBE Collectibles    Mailto:[EMAIL PROTECTED]
  / ) /--<  o // //      Castle of Medieval Myth & Magic http://www.todbe.com/
-/-' /___/_<_</_</_    http://dbecoll.tripod.com/ (My Perl/Lakers stuff)

_______________________________________________
Perl-Unix-Users mailing list
[EMAIL PROTECTED]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to