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,它可能会对性能产生一些影响,并且函数会多次被调用。