您是否着眼于可用的日期操作模块?我敢肯定,有一些将为你做大部分工作...
无论如何,你的代码的答案上面:你的排序子有很多问题;该代码甚至不会在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