my $d1 = 0; my @min; my @max; for(0 .. $#data-1) { my $d = $data[$_+1]-$data[$_]; push @{ $d<0 ? \@max : \@min }, [$_, $data[$_]] if $d*$d1<=0 && $d!=0 $d1 = $d; } if($d1>0) {push @max, [$#data, $data[-1]];} if($d1<0) {push @min, [$#data, $data[-1]];} print "max $$_[1] at $$_[0]\n" for(sort {$b[1] <=> $a[1]} @max); print "min $$_[1] at $$_[0]\n" for(sort {$a[1] <=> $b[1]} @min);