in reply to Reaped: count total number of occurrence in all files

Hello umaykulsum, one problem I see with your code is that while (<>) shifts (removes) the arguments from @ARGV. So when you are done reading, the size of @ARGV is 0. You can save the count before reading: my $file_count = @ARGV;

Another issue is that single quote prevent interpolation. Try print '\t\s';, you'll see that you don't get a tab and a space, but the string \t\s. You want to use double quotes instead. You either want to split on literal string, like "\t " or use a pattern in a regex like /\t\s/

You can optimize your code by doing more work in one loop (untested):

while (<>) { chomp; my ( $key, $value ) = split /\t\s/, $_; # Edited thanks to Anomalous +Monk $compare{$key}{count}++; $compare{$key}{sum} += $value; if ($file_count == $compare{$key}{count}) { print "$key: ", $compare{$key}{sum}; } }

Edit: "\t\s" doesn't work, see AnomalousMonk's answer below :)

Replies are listed 'Best First'.
Re^2: count total number of occurrence in all files
by AnomalousMonk (Archbishop) on May 09, 2016 at 13:45 UTC
    Another issue is that single quote prevent interpolation. ... You want to use double quotes instead.

    I don't understand the point you're making here. Using double-quote interpolation produces the string "\ts", which doesn't seem to be what the OPer wants to split on at all and which earns you an "Unrecognized escape ..." warning into the bargain. Indeed, in your example code, you use the  '\t\s' (a single tab character followed by any single whitespace character) as the split pattern. (Personally, I prefer to use  qr// or  m// instead. Potayto, potahto.)

    c:\@Work\Perl\monks>perl -wMstrict -MData::Dump -le "my $line = qq{foo\t bar\t\tbaz\t\nboff}; print qq{>>$line<<}; dd $line; ;; my @fields = split '\t\s', $line; dd \@fields; " >>foo bar baz boff<< "foo\t bar\t\tbaz\t\nboff" ["foo", "bar", "baz", "boff"] c:\@Work\Perl\monks>perl -wMstrict -MData::Dump -le "my $line = qq{foo\t bar\t\tbaz\t\nboff}; print qq{>>$line<<}; dd $line; ;; my @fields = split qq{\t\s}, $line; dd \@fields; " Unrecognized escape \s passed through at -e line 1. >>foo bar baz boff<< "foo\t bar\t\tbaz\t\nboff" ["foo\t bar\t\tbaz\t\nboff"]


    Give a man a fish:  <%-{-{-{-<

      You're right, \s doesn't make sense outside a regex, I read it as a single space character, which it actually is not. The fact that I split on '\t\s' is just a copy/paste gone wrong because I did mean to write "\t\s", which would have been incorrect anyway. I'll edit my post, thanks!