use Data::Dumper; while (<>) { chomp; my( $category, $item ) = split /\t/; push @{$category}, $item; undef $categories{$category}; } print "\nCategory: $_\n", Dumper \@$_ for keys %categories;