sub bydashdate { my($ma,$da,$ya)=split('-',$data->{news}[$a]{date}); my($mb,$db,$yb)=split('-',$data->{news}[$b]{date}); $ya <=> $yb || $ma <=> $mb || $da <=> $db; #select in y, m, d order the lower date } #you would call sort &bydashdate ( @{$data->{news}} )