my %items = ( z => [ qw/one six/ ], 'y' => [ qw/two three five/ ], x => [ qw/one two five/ ], ); my %corr; foreach my $item (keys %items) { my $max = scalar @{$items{$item}} - 1; for my $first (0..$max) { for my $second ($first+1..$max) { $corr{ $items{$item}[$first] }{ $items{$item}[$second] }++; } } } for my $first (keys %corr) { for my $second (keys %{$corr{$first}}) { print "$first $second: $corr{$first}{$second}\n"; } }