Perl 按正确顺序读入带编号的文件

Perl 按正确顺序读入带编号的文件,perl,Perl,我在一个目录中有1500个文件,我需要从每个目录中获取一些信息,并将其写入一个新的单个文件。文件名由一个单词和一个数字(Temp1、Temp2、Temp3等)组成,根据数字以正确的顺序读取文件非常重要。 我是用 my @files = <Temp*.csv>; for my $file (@files) { this part appends the required data to a seperate file and works fine }

我在一个目录中有1500个文件,我需要从每个目录中获取一些信息,并将其写入一个新的单个文件。文件名由一个单词和一个数字(Temp1、Temp2、Temp3等)组成,根据数字以正确的顺序读取文件非常重要。 我是用

my @files = <Temp*.csv>;

for my $file (@files) 
    { 
       this part appends the required data to a seperate file and works fine
    }  
my@files=;
对于我的$file(@files)
{ 
这部分将所需的数据附加到一个单独的文件中,工作正常
}  
我现在的问题是,文件没有以正确的顺序打开,但是在文件1之后,文件100被打开。 谁能给我一个提示,我怎样才能让它按正确的顺序读取文件

谢谢,, Ca

您可以使用它一步读取和排序文件

my @files = 
  map { $_->[0] }
  sort { $a->[1] <=> $b->[1] }
  map { [ $_, /(\d+)/ ] } <Temp*.csv>;
my@files=
映射{$\->[0]}
排序{$a->[1]$b->[1]}
映射{[$\uu1,/(\d+/]);
或者使用效率更低、更直接的排序

my @files = sort { ($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0] } <Temp*.csv>;
my@files=sort{($a=~/(\d+)/)[0]($b=~/(\d+)/)[0]};

如果数字确实很重要,您可能希望在文件名之后读取它们,并报告丢失文件的错误:

my @nums = 1 .. 1500;  # or whatever the highest is

for my $num (@nums) {
    my $file = "Temp$num.csv";
    unless (-e $file) {
        warn "Missing file: $file";
        next;
    }
    ...
    # proceed as normal
}
如果需要文件计数,只需使用旧glob即可:

my @files = <Temp*.csv>;
my $count = @files;       # get the size of the array
my @nums = 1 .. $count;

按顺序对文件进行自然排序

下面将自动自然地对文件进行排序,将名称的字母和数字部分分离出来,以便进行适当的排序逻辑

use strict;
use warnings;

use Sort::Key::Natural qw(natsort);

for my $file ( natsort <Temp*.csv> ) {
    # this part appends the required data to a seperate file and works fine
}

或者不使用ST:
my@files=sort{($a=~/(\d+)/)[0]($b=~/(\d+)/)[0]}在较长的列表中速度较慢,但对于典型的使用,您不会注意到差异。Schwartzian变换是一种优化,在编写和测试代码之前,不应使用它,因为代码速度太慢,并且分析后发现排序是一个瓶颈。没有转换的版本不必要地将自身限制在单个表达式中,而且非常不清晰。2017年最明显的解决方案是使用
List::UtilsBy::nsort_by
@Schwern你能在上面的评论中发表你的意见吗?Tnx。
use strict;
use warnings;

use Sort::Key::Natural qw(natsort);

for my $file ( natsort <Temp*.csv> ) {
    # this part appends the required data to a seperate file and works fine
}
use strict;
use warnings;

use Sort::Key::Natural qw(natsort);

print natsort <DATA>;

__DATA__
Temp100.csv
Temp8.csv
Temp20.csv
Temp1.csv
Temp7.csv
Temp1.csv
Temp7.csv
Temp8.csv
Temp20.csv
Temp100.csv