我有一个mmddyyyy_nnnnn
格式的文件列表。如何使用perl找到postfix nnnnn
中编号最大的文件?
示例:对于这三个文件
11232014_00001
11232014_00002
11232014_00003
我想返回00003的文件名。
答案 0 :(得分:2)
#!/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;
中的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