1

形式のファイル名のリストがありますinteger_Name.txt。最大の整数値を持つファイル名を返したい。文字列比較以外に perl でこれを行う方法はありますか?

4

2 に答える 2

5

これは通常、自然ソートと呼ばれます。それを実装するモジュールがあります: Sort::Naturally

最高値を取得するには、並べ替えて最後の要素を取得できます。

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

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

更新 - 手動で並べ替え

map/sort/map イディオムの使用。ただし、ファイル名に単一の数字がある場合にのみ機能します。

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(...);
于 2012-07-30T22:09:18.450 に答える
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};
于 2012-07-30T22:21:00.583 に答える