需要根据文件名中的日期戳对文件列表进行排序

问题描述 投票:2回答:4

未排序的数据

5CM00225_10_16_2017_10_54_42.xml
5CM10538_10_16_2017_11_04_18.xml
1ZM06004_10_16_2017_11_04_14.xml
5XM10010_10_17_2017_08_00_47.xml
5ZM05391_10_15_2017_08_51_07.xml
5ZM05388_10_17_2017_08_01_06.xml
5ZM00058_10_17_2017_08_00_49.xml
NMC00166_10_15_2017_08_51_06.xml
5CM10538_10_15_2017_08_51_06.xml

预期结果

NMC00166_10_15_2017_08_51_06.xml
5CM10538_10_15_2017_08_51_06.xml
5ZM05391_10_15_2017_08_51_07.xml
5CM00225_10_16_2017_10_54_42.xml
1ZM06004_10_16_2017_11_04_14.xml
5CM10538_10_16_2017_11_04_18.xml
5XM10010_10_17_2017_08_00_47.xml
5ZM00058_10_17_2017_08_00_49.xml
5ZM05388_10_17_2017_08_01_06.xml

我使用Net::SFTP获取远程站点上列出的目录,并与本地文件列表进行比较。我想按文件名中的日期对列表进行排序,但是由于字符串中还有其他信息需要忽略,因此我遇到了问题。

my $sftp = Net::SFTP->new( $host,  %args);

my @list = $sftp->ls($path);

open(my $fh, '>', $file); # open a log file to save remote directory listing

    my @sorted = map  { $_->[0] }
         sort { $a->[1] <=> $b->[1] }
         map  { [$_, $_=~/(\d{2})_(\d{2})_(\d{4})_(\d{2})_(\d{2})_(\d{2})/] } # unsuccessful sorting attempt
         @list;

    foreach my $item (@sorted) {
        $i = ${item}->{filename};                               
        print $fh "$1\n"; # prints each record to the open log file
    }
close $fh;

我之前已经进行过排序,并进行了大量的正则表达式,但是从来没有同时进行过,我很显然将它弄乱了,因为它没有进行任何排序,也没有引发任何错误。

我曾考虑过从每个字符串中提取DD_MM_YYYY_hh_mm_ss并尝试将其用作参考,但是我没有取得任何可用的进展,因此我放弃了这个想法。

arrays perl sorting hash
4个回答
4
投票

1
投票

1
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.