2014-11-29 3 views

ответ

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 
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 для явно линейного алгоритма (вы на самом деле не нужно отсортировать список, вы только хотите чтобы найти максимум), так что вот решение с использованием старого старого foreach и без сортировки:

use strict; 
use Modern::Perl; 

my @files = qw(11232014_00001 11242013_00002 11232012_00003 22222222_00001); 
my ($max_value, $max); 
foreach (@files) { 
     if (/_(\d+)$/ && (!defined $max_value || $1 > $max_value)) { 
       $max_value = $1; 
       $max = $_; 
     } 
} 
say $max; 
1

Полный сорт как в ST не эффективен для больших списков при поиске только для максимального значения, таким образом reduce от List::Util основного модуля может быть оптимальным решением,

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 из List::UtilsBy

use List::UtilsBy 'max_by'; 

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