このケースで「エポックに変換」して sort ってえらくめんどくさい事に
ならないか? それともいい関数があるのかなあ。
普通に
sort { length $b <=> length $a or $a <=> $b } @list

でいいじゃん。or 797 のやり方。
############ お試しソース ############
use Time::Local ;
sort { &conv($a ) <=> &conv ($b) } @list ;
sub conv ($) {
 my $uru = sub { # 閏年の計算。
  return $_[0] % 400 == 0 ? 1 : $_[0] % 100 == 0 ? 0 : $_[0] % 4 == 0 ? 1 : 0 ;
 } ;
 my @dat = # ソートの優先順位を付けるための小細工。
  length $_[0] == 8 ? ( $_[0] =~ /^(¥d{4})(¥d{2})(¥d{2})$/, 0, 0, 0 ) :
  length $_[0] == 6 ? ( $_[0] =~ /^(¥d{4})(¥d{2})$/, 0, 23, 59, 58 ) : # 日付まで分かってるものよりも後にするため。
            ( $_[0] =~ /^(¥d{4})$/, 12, 0, 23, 59, 59 ) ; # 月まで分かってるものよりも後にするため。

 my $day = ( 31, $uru->($dat[0]) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 30 )[$dat[1] - 1] ;
 $dat[2] = $day if $dat[2] == 0 ; $dat[0] -= 1900 ;$dat[1] -= 1 ;
  return timelocal reverse @dat ;
}