I've had a look over both yours and toolics' solutions, and decided to stick with yours, as I found dealing with the output of your version a lot easier - not too sure how to get the output from toolics' version into a nice pipe-delimited format. Had a poke around on Google and here, and couldn't find anything that my mind attached itself to as a reasonable solution.
So, after having a bit more of a play, this is what I've ended up with. Could you take a look, and see if you can see anything wrong with it, please?
#!/usr/bin/perl
use strict;
use warnings;
my %sum;
while (<DATA>) {
chomp;
my ($key, $value, $reason) = split(/\|/);
if (! defined $reason || $value !~ /^\d+$/) {
warn qq<dropped line: "$_"\n>;
next;
}
$sum{$key}{value} += $value;
if (! defined $sum{$key}{reason})
{
$sum{$key}{reason} = $reason;
}
}
local $" = '/';
for my $key (keys %sum) {
print "$key|$sum{$key}{value}|$sum{$key}{reason}\n";
}
__DATA__
USERID1|2215|Jones,Tom|
USERID1|1000|Jones, Tom|
USERID3|1495|Dole, Bob|
USERID2|2500|Francis, Pope|
USERID2|1500|Francis, Pope|
USERID4|0045|Doe, John|
USERID5|1225|Doe, Jane|
USERID4|4995|Doe, John|
USERID4|9995|Doe, John|
USERID6|1095|Darwin, Anita|
USERID7|1495|Dawson, Gary|
USERID6|1250|Darwin, Anita|
Prints:
USERID5|1225|Doe, Jane
USERID3|1495|Dole, Bob
USERID7|1495|Dawson, Gary
USERID1|3215|Jones,Tom
USERID4|15035|Doe, John
USERID2|4000|Francis, Pope
USERID6|2345|Darwin, Anita
|