#! perl -sw use strict; use List::Util qw[ min ]; use Data::Dump qw[ pp ]; my %pvalues = ( 1=> 0.5453980, 2=> 0.4902384, 3=> 0.8167950, 4=> 0.2821822, 5=> 0.4693030, 6=> 0.6491767, 7=> 0.9802138, 8=> 0.1155778, 9=> 0.9585124, 10=> 0.4069490 ); my @orderedKeys = sort { $pvalues{ $b } <=> $pvalues{ $a } } keys %pvalues; my $d = my $n = values %pvalues; $pvalues{ $_ } *= $n / $d-- for @orderedKeys; $pvalues{ $orderedKeys[ $_ ] } = min( @pvalues{ @orderedKeys[ 0 .. $_ ] } ) for 1 .. $n-1; pp \%pvalues; __END__ c:\test>junk68 { 1 => "0.908996666666667", 2 => "0.908996666666667", 3 => "0.9802138", 4 => "0.908996666666667", 5 => "0.908996666666667", 6 => "0.927395285714286", 7 => "0.9802138", 8 => "0.908996666666667", 9 => "0.9802138", 10 => "0.908996666666667", }