A couple of things I noticed with your code...
The and $c++ will probably never get called. It's certainly not what you meant, which would be more like this:
next if ( $c++ == 0 ); # skip the file header
Firstly, the increment on $c should've done at the start of the loop. Although, you need to adjust it to account for the header line. You should read in the header line before the loop. Then you could do away with the if statement totally. Then you'd also want to move the increment to the bottom of the loop so you get 0 the first time through.
Secondly, (a minor point) "$_ |" would give you a trailing |, which you probably don't want. Also, I don't see why you need to format the elements as you read them anyway. Why not format them as you display them?
Well, here's my go at it. It's may be a bit obtuse, but it works.
#!/usr/bin/perl -w use strict; my @master_list = (); readfile("f1.lst", \@master_list); readfile("f2.lst", \@master_list); readfile("f3.lst", \@master_list); printf "%s | %s | %s\n", @{$_}[0..2] for(@master_list); sub readfile { my $filename = shift or die "Need filename.\n"; my $listref = shift; # Listed pointed to is modified in place. open my $file, "< $filename" or die "Can't open $filename: $!\n"; my $header = <$file>; my $c = 0; local $_; while(<$file>) { $listref->[$c] ||= []; # use strict doesn't like auto-viv. chomp; # Compare the new value with the first value stored in the list. # First value to be read in for any row is assumed to be # correct. All subsequent values must match that first one. unless(@{$listref->[$c]} and $_ != $listref->[$c][0]) { push @{$listref->[$c]}, $_; } else { push @{$listref->[$c]}, ' '; } ++$c; } close $file or die "Can't close $filename: $!\n"; }
HTH.
bbfu
Seasons don't fear The Reaper.
Nor do the wind, the sun, and the rain.
We can be like they are.
In reply to Re: Printing out multiple array lists and more!
by bbfu
in thread Printing out multiple array lists and more!
by snafu
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |