您是否着眼於可用的日期操作模塊?我敢肯定,有一些將爲你做大部分工作...
無論如何,你的代碼的答案上面:你的排序子有很多問題;該代碼甚至不會在Perl 5.20上運行:
-
斜線不會轉義,但它們是模式分隔符。
我使用m##
- 在OP中也修正了Escape。
- 您沒有重新排列日期組件。總的來說,首先要把年份縮短;你認爲你在做什麼? 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;
}
目前仍沒有錯誤檢查,以嚴格的/警告使運行如果傳遞無效數據將返回錯誤很多。如果先驗證格式,你不需要額外的代碼,但要防止錯誤嚴重形成的約會,你還可以添加一些檢查和使用字符串CMP回退:
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