in reply to Re^2: Piping many individual files into a single perl script
in thread Piping many individual files into a single perl script
You need to detect the end of each individual file, print your results for that file and reset the counts. See the explanation of eof(ARGV) in perlfunc:
#!C:\Perl use strict; BEGIN{ @ARGV=map glob, @ARGV; } open(RES, ">>results.txt"); print RES "File Number A A% B B% Null Null%\n"; my $A = 0; #these three lines set my initial counts at zero my $B = 0; my $null = 0; my $filenum = 0; while( <> ){ chomp($_); if ($_ eq "stringa"){ $A++;} elsif ($_ eq "stringb"){ $B++;} else { $null++; } if( eof( ARGV ) ) { ## true after the end of each individual file my $popa = sprintf( '%.2f', $A / 1000 ); my $popb = sprintf( '%.2f', $B / 1000 ); my $popnull = sprintf( '%.2f', $null / 1000 ); my $filenum++; #Add one to my filenumber print RES "$filenum $A $popa $B $popb $null + $popnull\n"; $A = $B = $null = 0; ## Reset counts for the next file } }
As I mentioned above, if OS/X is a *nix-like system, you probably don't need the @ARGV = map glob, @ARGV as the shell will take care of that for you. (Though it probably won't do any harm.)
Also, in your code you have several place where you do:
... my $var = ....; my $var = sprintf ... $var; ...
If you are running with strict and warnings, you should be getting messages of the form: "my" variable $var masks earlier declaration in same scope at .......don't ignore them, they are there for a purpose.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Piping many individual files into a single perl script
by broomduster (Priest) on Sep 28, 2008 at 14:47 UTC | |
by BrowserUk (Patriarch) on Sep 28, 2008 at 15:30 UTC |