Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 文件名的自定义排序_Perl_Sorting - Fatal编程技术网

Perl 文件名的自定义排序

Perl 文件名的自定义排序,perl,sorting,Perl,Sorting,我有一个文件列表: TC-00001-(null)-20141027-204159FN.tif TC-00020-(null)-20141027-203422FN.tif 等 我需要以有序的方式处理这些文件,但不是排序{$a cmp$b}给我的默认方式。目前,它是根据TC-0000X计数进行排序的 事实上,我想根据FN字符前面的最后一个数字(204159和203422)进行排序。这是一种简化的时间戳20:14:59和20:34:22 这些文件的采样频率为1秒,因此此时间戳唯一标识文件 如何使用

我有一个文件列表:

TC-00001-(null)-20141027-204159FN.tif
TC-00020-(null)-20141027-203422FN.tif

我需要以有序的方式处理这些文件,但不是
排序{$a cmp$b}
给我的默认方式。目前,它是根据
TC-0000X
计数进行排序的

事实上,我想根据
FN
字符前面的最后一个数字(
204159
203422
)进行排序。这是一种简化的时间戳
20:14:59和20:34:22

这些文件的采样频率为1秒,因此此时间戳唯一标识文件


如何使用这个数字在perl中进行排序?

排序允许您定义自定义排序,该排序将根据您喜欢的任何算法进行排序

sub需要返回正、零或负-很像
cmp
do

$a
$b
是用于此目的的特殊变量

因此,在你的情况下:

#!/usr/bin/perl

use strict;
use warnings;

sub compare_last {
    #first we extract the values we're interested in...
    my ( $a_last ) = ( $a =~ m/(\d+)FN\./ );
    my ( $b_last ) = ( $b =~ m/(\d+)FN\./ );

 #   print "GOT: $a_last, $b_last, \n";

    #then we return the comparison. <=> is numeric, but you could use cmp. 
    #or manually set your own return codes - sort doesn't care, just bear in mind that 
    #each element is compared so you can end up with some pretty fruity results if you 
    #return a random number or something. 
    return ( $a_last <=> $b_last ); 
}

print sort compare_last <DATA> ;


## some dummy data

__DATA__
TC-00001-(null)-20141027-204159FN.tif
TC-00020-(null)-20141027-203422FN.tif
TC-00001-(null)-20141027-204159FN.tif
TC-00020-(null)-20141027-123456FN.tif
TC-00001-(null)-20141027-332FN.tif
TC-00020-(null)-20141027-018234FN.tif
#/usr/bin/perl
严格使用;
使用警告;
最后一次比较{
#首先我们提取我们感兴趣的值。。。
我的($a_last)=($a=~m/(\d+)FN\);
我的($b_last)=($b=~m/(\d+)FN\);
#打印“GOT:$a\u last,$b\u last,\n”;
#然后我们返回比较。是数字,但可以使用cmp。
#或者手动设置您自己的返回代码-排序并不重要,请记住
#每个元素都经过比较,因此如果您
#返回一个随机数或什么的。
报税表($a_last$b_last);
}
最后打印排序比较;
##一些虚拟数据
__资料__
TC-00001-(空)-20141027-204159FN.tif
TC-00020-(空)-20141027-203422FN.tif
TC-00001-(空)-20141027-204159FN.tif
TC-00020-(空)-20141027-123456FN.tif
TC-00001-(空)-20141027-332FN.tif
TC-00020-(空)-20141027-018234FN.tif

排序允许您定义自定义排序,该排序将根据您喜欢的任何算法进行排序

sub需要返回正、零或负-很像
cmp
do

$a
$b
是用于此目的的特殊变量

因此,在你的情况下:

#!/usr/bin/perl

use strict;
use warnings;

sub compare_last {
    #first we extract the values we're interested in...
    my ( $a_last ) = ( $a =~ m/(\d+)FN\./ );
    my ( $b_last ) = ( $b =~ m/(\d+)FN\./ );

 #   print "GOT: $a_last, $b_last, \n";

    #then we return the comparison. <=> is numeric, but you could use cmp. 
    #or manually set your own return codes - sort doesn't care, just bear in mind that 
    #each element is compared so you can end up with some pretty fruity results if you 
    #return a random number or something. 
    return ( $a_last <=> $b_last ); 
}

print sort compare_last <DATA> ;


## some dummy data

__DATA__
TC-00001-(null)-20141027-204159FN.tif
TC-00020-(null)-20141027-203422FN.tif
TC-00001-(null)-20141027-204159FN.tif
TC-00020-(null)-20141027-123456FN.tif
TC-00001-(null)-20141027-332FN.tif
TC-00020-(null)-20141027-018234FN.tif
#/usr/bin/perl
严格使用;
使用警告;
最后一次比较{
#首先我们提取我们感兴趣的值。。。
我的($a_last)=($a=~m/(\d+)FN\);
我的($b_last)=($b=~m/(\d+)FN\);
#打印“GOT:$a\u last,$b\u last,\n”;
#然后我们返回比较。是数字,但可以使用cmp。
#或者手动设置您自己的返回代码-排序并不重要,请记住
#每个元素都经过比较,因此如果您
#返回一个随机数或什么的。
报税表($a_last$b_last);
}
最后打印排序比较;
##一些虚拟数据
__资料__
TC-00001-(空)-20141027-204159FN.tif
TC-00020-(空)-20141027-203422FN.tif
TC-00001-(空)-20141027-204159FN.tif
TC-00020-(空)-20141027-123456FN.tif
TC-00001-(空)-20141027-332FN.tif
TC-00020-(空)-20141027-018234FN.tif

这可以通过使用一个线性程序来完成(与其他
列表一样:*
模块,具有提高效率的功能)

perl-MList::UtilsBy::XS=orsort_by-wle'print-orsort_by{/(\d+)FN[.]/?$1:-1}'filelist.txt

这可以通过使用一个线性程序来完成(与其他
列表一样:*
模块,具有提高效率的功能)

perl-MList::UtilsBy::XS=orsort_by-wle'print-orsort_by{/(\d+)FN[.]/?$1:-1}'filelist.txt

非常感谢!但这有点让人困惑,因为Perl怎么知道$a_last和$a变量有任何关系呢。当给定
$a
$b
my($a_last,$b_last)=map/(\d+)FN\./,$a,$b虽然你是对的,但是map是一个很好的解决方案-它仍然让我头疼,所以我不愿意建议别人使用它:)map只对减少代码/正则表达式冗余有用,但是考虑到这不是Schwartzian,它可能会对性能产生一些影响,并且函数会被调用很多次。非常感谢!但这有点让人困惑,因为Perl怎么知道$a_last和$a变量有任何关系呢。当给定
$a
$b
my($a_last,$b_last)=map/(\d+)FN\./,$a,$b虽然你是对的,但是map是一个很好的解决方案-它仍然让我头疼,所以我不愿意建议别人使用它:)map只对减少代码/正则表达式冗余有用,但考虑到这不是Schwartzian,它可能会对性能产生一些影响,并且函数会多次被调用。