вы смотрели на доступные даты манипуляции модули? Я уверен, что есть некоторые, которые сделают большую часть работы для вас ...
В любом случае ответ на ваш код выше: ваш сортир имеет много проблем; код даже не работает на Perl 5.20:
-
Косые черты не экранированы, но они являются разделителями рисунков.
Я использовал m##
- Исключения зафиксированы в OP тоже.
- Вы не переупорядочиваете компоненты даты. Все дело в том, чтобы сократить первый год; где вы думаете, что вы это делаете? I
sprintf()
'дата в фиксированном YYYYMMDD
номер.
- Вы только назначая первый элемент из матчей в
$adate
и $bdate
, т.е. сортировочного только месяц - исправляются sprintf()
- Вы соответствуете фиксированным строкам в финиковых компонентах, но день/месяц в вашем примере имеет либо один или двух символов. Вместо этого я использовал
\d{1,2}
.
Вот неподвижная суб:
sub sortByDate {
$a =~ m#(\d{1,2})/(\d{1,2})/(\d{4})#;
my $adate = sprintf('%i%02i%02i', $3, $1, $2);
$b =~ m#(\d{1,2})/(\d{1,2})/(\d{4})#;
my $bdate = sprintf('%i%02i%02i', $3, $1, $2);
return $adate <=> $bdate;
}
Там до сих пор нет проверки ошибок, поэтому работает со строгим предупреждением/возвратит много ошибок, если вы передадите неверные данные. Вам не нужен дополнительный код, если вы проверяете формат первого, но, чтобы предотвратить ошибки из плохо сформированных дат вы можете также добавить некоторые проверки и использование строки КСС запасной вариант:
sub sortByDate {
my $adate = sprintf('%i%02i%02i', $3, $1, $2)
if ($a =~ m#(\d{1,2})/(\d{1,2})/(\d{4})#);
my $bdate = sprintf('%i%02i%02i', $3, $1, $2)
if ($b =~ m#(\d{1,2})/(\d{1,2})/(\d{4})#);
return $adate <=> $bdate if ($adate && $bdate);
return $a cmp $b;
}
Пожалуйста, проверьте ответы и проголосуйте, если вы согласны с тем же ...! – ssr1012