#! /usr/bin/perl use strict; use warnings; use Data::Dumper; my %HoH; while () { 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