my $records; while(){ chomp; my @fields = split /\s+/,$_; $records->{$fields[0]}{$fields[1]}{$fields[2]} += 1; } foreach my $level1 (keys %$records){ foreach my $level2 (keys %{$records->{$level1}}){ foreach my $level3 (keys %{$records->{$level1}{$level2}}){ print "$level1 $level2 $level3 => ", $records->{$level1}{$level2}{$level3},"\n"; } } } __DATA__ sunny t a sunny t b sunny f a sunny f a sunny b b windy f a windy f b __OUTPUT__ windy f a => 1 windy f b => 1 sunny f a => 2 sunny b b => 1 sunny t a => 1 sunny t b => 1