查找具有最大数字后缀的文件名

时间:2014-11-29 21:20:05

标签: regex perl perl-data-structures

我有一个mmddyyyy_nnnnn格式的文件列表。如何使用perl找到postfix nnnnn中编号最大的文件?

示例:对于这三个文件

11232014_00001
11232014_00002
11232014_00003

我想返回00003的文件名。

4 个答案:

答案 0 :(得分:2)

我使用Schwartzian transform

#!/usr/bin/perl
use Modern::Perl;

my @files = qw(11232014_00001 11242013_00002 11232012_00003);
my ($highest)= 
    map { $_->[0] }
     sort { $b->[1] <=> $a->[1] }
      map { [$_, /(\d+)$/] }
       @files;
say $highest;

<强>输出:

11232012_00003

答案 1 :(得分:2)

我讨厌使用sort显然是线性算法(你实际上不需要对列表进行排序,你只想找到一个最大值),所以这里有一个使用旧的{{1}的解决方案循环并且根本没有排序:

foreach

答案 2 :(得分:1)

ST中的完全排序对于较大的列表仅在查找最大值时效率不高,因此来自List::Util核心模块的reduce可能是最佳解决方案,

use List::Util 'reduce';

my @files = qw(11232014_00001 11242013_00002 11232012_00003);
my ($max) = reduce {
    my ($aa, $bb) = map /(\d+)$/, $a,$b;
    $aa > $bb ? $a : $b
  }
  @files;

使用List::UtilsBy

中的max_by的类似方法
use List::UtilsBy 'max_by';

my @files = qw(11232014_00001 11242013_00002 11232012_00003);
my $max = max_by { ( /(\d+)$/ )[0] } @files;

答案 3 :(得分:0)

由于您处理固定宽度的文件名,我建议您按字母顺序重新格式化和排序:

use strict;
use warnings;

my @files = qw(11232014_00001 11242014_00002 11232015_00003);

my @sorted = sort {
    local ( $a, $b ) = map { s/(\d{2})(\d{2})(\d{4})/$3$1$2/r or die "Invalid format: $_" } ( $a, $b );
    $a cmp $b;
} @files;

print "$sorted[-1]";

输出:

11232015_00003