use strict; my %hash1; my %hash2; my @data = (0 .. 5000); for (my $i = 0; $i < scalar(@data); $i++ ) { for (my $j = $i; $j < scalar(@data); $j++) { $hash1{ $data[$i] }{ $data[$j] } = 0; $hash2{ $data[$i] }{ $data[$j] } = 0; } } while ( my ($key1, $val1) = each %hash1 ) { while ( my ($key2, $val2) = each %$val1 ) { print join( "\t", $key1, $key2, $hash1{$key1}{$key2}, $hash2{$key1}{$key2} ), "\n"; } }