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.
In reply to Re^3: Piping many individual files into a single perl script
by BrowserUk
in thread Piping many individual files into a single perl script
by kelder
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |