Как сортировать даты в Perl?
Как сортировать даты в Perl?
my @dates = ( "02/11/2009" , "20/12/2001" , "21/11/2010" );
у меня есть выше даты в моем массиве . Как я могу сортировать эти даты?
мой формат даты dd/mm/YYYY
.
4 ответов
@dates = sort { join('', (split '/', $a)[2,1,0]) cmp join('', (split '/', $b)[2,1,0]) } @dates;
или с помощью отдельной подпрограммы сортировки:
sub mysort {
join('', (split '/', $a)[2,1,0]) cmp join('', (split '/', $b)[2,1,0]);
}
@dates = sort mysort @dates;
Update: более эффективным подходом является преобразование Шварца:
@dates =
map $_->[0],
sort { $a->[1] cmp $b->[1] }
map [ $_, join('', (split '/', $_)[2,1,0]) ], @dates;
Я предпочитаю YYYY/MM/DD
формат лучше, именно по этой причине. Гарантируется правильная сортировка дат между 1000/01/01
и 9999/12/31
.
my @sorted_alt = sort map { join '/', reverse split '/', $_ } @dates;
Если вам действительно нужно это в DD/MM/YYYY
формат, вы всегда можете пойти на полный преобразование Шварца.
my @sorted = map {
join '/', reverse split '/', $_
}
sort
map {
join '/', reverse split '/', $_
} @dates;
или
my @sorted = map {
join '/', reverse @$_
}
sort { "@$a" cmp "@$b" }
map {
[ reverse split '/', $_ ]
} @dates;
или используйте формат эпохи в метке времени и сортируйте их как числа. Затем преобразуйте выходные данные строк даты, как вы хотите. Тогда вы не застряли с форматированием исходных строк.
многие люди здесь правильно утверждали, что исходный формат дат должен быть в формате гггг-ММ-ДД, но никто не дал код Perl, который может справиться с этим случаем. Вот оно:
my @dates = (
'2014-08-15',
'2016-09-13',
'2001-01-02',
'1998-09-22',
'1998-09-21',
'1998-09-23',
'1999-04-20',
'2020-01-30',
);
@dates = sort {$a cmp $b} @dates; # 1998 is the first date's year
@dates = sort {$b cmp $a} @dates; # 2014 is the first date's year