This should work as expected. I used hash of hashes, as it looks simpler for me:
#! /usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %HoH;
while (<DATA>) {
chomp $_;
#print "<$_>\n";
my ($lev1, $lev2, $amount) = (split /\s+/, $_);
#print "<$lev1>, <$lev2>, <$amount>, \n";
if (exists $HoH{$lev1}{$lev2}) {
$HoH{$lev1}{$lev2} = $HoH{$lev1}{$lev2} + $amount;
}
else {
$HoH{$lev1}{$lev2} = $amount;
}
}
#print Dumper(\%HoH);
while (my ($lev1, $inter) = each %HoH) {
while (my ($lev2, $amount) = each %$inter) {
printf ("%-10s%-10s%-5d\n", $lev1,$lev2,$amount);
}
}
__DATA__
Apple Grape 100
Ginger Fry 200
Apple Grape 80
Ginger Banana 800
Ginger Fry 150
Ginger Banana 45
prints on my system:
Ginger Fry 350
Ginger Banana 845
Apple Grape 180
maybe you want to change formatting.