use strict 'vars';

unless (open DEP, "<", "deposits.txt") {
  die "Couldn't open 'deposits.txt' for reading: $!; aborting";
}

my %total;
my %total_deposits;
my %num_deposits;
while (<DEP>) {
  my ($who, $action, $how_much) = split;
  unless ($how_much =~ /^\d+\.\d\d/) {
    die "Malformed amount field";
  }
  if ($action eq 'deposit')     { 
    $total{$who} += $how_much;
    $total_deposits{$who} += $how_much;
    $num_deposits{$who} += 1;
  }
  elsif ($action eq 'withdraw') { $total{$who} -= $how_much }
  else { die "Bizarre action field `$action'" }
}

my %average_deposit;
for my $c (sort keys %total_deposits) {
  if ($num_deposits{$c}) {
    $average_deposit{$c} = $total_deposits{$c} / $num_deposits{$c};
  } else {
    $average_deposit{$c} = 0;
  }
}

my @customers = keys %average_deposit;
for my $c (sort {$average_deposit{$b} <=> $average_deposit{$a}} @customers) {
  printf "%12s %8.2f %8.2f\n", $c, $total{$c}, $average_deposit{$c};
}
