use strict; use warnings; use Data::Dumper; my %hash2 =( '1' => 2, '3' => 5, '4' => 2,); my %spair = (); my $prod; foreach my $si (keys %hash2) { foreach my $sn (keys %hash2) { if ($si == $sn) { $prod = $hash2{$si}; } else { $prod = $hash2{$si}*$hash2{$sn}; } if ( $si >= $sn ) { $spair{$si."-".$sn} = $prod; } else { $spair{$sn."-".$si} = $prod; } } } print Dumper \%spair;