如何比较perl中的文件名

时间:2012-07-30 21:57:46

标签: perl

我有一个integer_Name.txt格式的文件名列表。我想返回具有最高整数值的文件名。除了字符串比较之外,还有什么办法可以在perl中完成吗?

2 个答案:

答案 0 :(得分:5)

这通常称为自然排序。有实现它的模块:Sort::Naturally

要获得最高价值 - 您可以排序并获取最后一个元素:

use strict; use warnings;
use Sort::Naturally;

my @names = (...);
my $name_with_biggest_number = (nsort(@names))[-1];

更新 - 手动排序

使用map/sort/map idiom。但只有在文件名中有单个数字时才会起作用:

use strict; use warnings;

my @names = (...);
my @sorted_names = 
    map { $_->[0] }
    sort { $b->[1] <=> $a->[1] } ## descending order
    map { [ $_, m/(\d+)/ ] }     ## extracting first number
    @names;
my $name_with_biggest_number = $sorted_names[0];

更新 - 无排序

根据输入数据,避免使用sort会更有效。因此,您可以显式编码最大数字的搜索:

sub name_with_largest_number {
        my (@names) = @_;

        my $max_number = undef;
        my $name_with_max_number = undef;
        for my $name (@names) {
                my ($number) = ($name =~ m/(\d+)/);
                if (defined $number) {
                        if (! defined $max_number || $number > $max_number) {
                                $max_number = $number;
                                $name_with_max_number = $name;
                        }
                }
        }
        return $name_with_max_number;
}

print name_with_largest_number(...);

答案 1 :(得分:1)

编辑:这是一种不需要昂贵排序的替代品。谢谢@tchrist指出排序是多么愚蠢。

use strict; use warnings;
use Data::Dumper;

my @list = qw(
332_Name.txt
999_Name.txt
125_Name.txt
9_Name.txt
0066_Name.txt
);

my %mapping;
my $highest = 0;
foreach(map { m/(\d+)/; $mapping{$1} = $_; $1 } @list) {
  $highest = $_ if $_ > $highest;
}
print $mapping{$highest};
相关问题