根据复杂文件名中的字符串日期对数组进行排序

时间:2017-11-17 00:41:26

标签: perl

我有一组字符串:

  

20120160323001.z1.xml
     20120160324001.z1.xml
     20120160322001.z1.xml

     

#文件格式为XXXYYYYMMDDVVV.z1.xml,其中XXX为
     #medical code,YYYYMMDD是日期,VVV是文件
     #version number

我想按照降序排列日期对字符串进行排序。因此,排序后的上述字符串将为:

  

20120160324001.z1.xml
     20120160323001.z1.xml
     20120160322001.z1.xml

我知道如何在Perl中对数组进行排序,但考虑到复杂的文件名,我很困惑如何按日期对这些字符串进行排序?有可能吗?

# The below sort function is not going to work for these filenames
sub rev_by_date  { 
    $b->[9+1] <=> $a->[9+1] 
}

my @sorted_files = sort rev_by_date @files;

编辑我使用此正则表达式来查找这些文件:(?^:^201.*.z1.xml)但它对日期排序功能没有用处。在日期排序功能中,我不知道比较日期字符串是否会起作用?

2 个答案:

答案 0 :(得分:3)

您希望按照与日期部分匹配的子字符串进行排序:

sub rev_by_date {
  substr($b, 3, 8) <=> substr($a, 3, 8);
}

my @sorted_files = sort rev_by_date @files;

...只要文件名与您描述的格式匹配。

答案 1 :(得分:0)

尝试

sort { substr($b, 3) cmp substr($a, 3) } @files;

这假设@files包含字符串。如果它包含其他内容,您需要解释它。它将文档版本保留在排序键的末尾,因此这将破坏关系。