use feature ":5.14"; use warnings FATAL => qw(all); use strict; use Data::Dump qw(dump pp); my @l = split /\n/, << 'END'; Ubuntu,Warty,No Ubuntu,Hoary,No Ubuntu,Breezy,Yes Ubuntu,Breazy,Yes Fedora,Yarrow,Yes Fedora,Stentz,No Fedora,Yarrow,Yes Fedora,Yarrow,Yes Windows,XP PRO,Yes Windows,XP PRO,Yes Windows,XP Home,No Windows,XP PRO,Yes END my $h; for(@l) {my @w = split /,/; $h->{$w[0]}{$w[1]}{$w[2]}++; } pp($h); for my $o(sort keys %$h) {for my $r(sort keys %{$h->{$o}}) {my %yn = %{$h->{$o}{$r}}; my ($yes, $no) = ($yn{Yes}//0, $yn{No}//0); say "$o\t$r\t$yes\t$no"; } }