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.


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
"Too many [] have been sedated by an oppressive environment of political correctness and risk aversion."

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
    I was about to post a reply with similar suggestions... Now the only new things I can add are
    • on a Mac the
      BEGIN{ @ARGV=map glob, @ARGV; }
      is definitely not required.
    • I also noticed that the OP is using #!C:\Perl as the shebang line. On a Mac this should be #!/usr/bin/perl for an Apple-supplied Perl, but will need a different path if it's a user-installed Perl (e.g., from MacPorts, or elsewhere)
      I also noticed that the OP is using #!C:\Perl as the shebang line.

      I missed that++. That's a very strange choice for someone using a MAC (which doesn't have drive letters?), and wouldn't work on any *nix variant I'm aware of.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.