if ( $si >= $sn ) { $spair{$si."-".$sn} = $prod; } else { $spair{$sn."-".$si} = $prod; } #### 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; #### $VAR1 = { '3-1' => '10', '3-3' => 5, '1-1' => 2, '4-1' => '4', '4-3' => '10', '4-4' => 2 };