我正在寻找一个逻辑(不是附加模块)来按这种格式排序.我有一个字符串列表,看起来像:
asdadasBBBsfasdasdas-0112
asdanfnfnfnfnf222ads-1210
Run Code Online (Sandbox Code Playgroud)
我不能按数字排序,因为,例如:812> 113(812 = 2012年8月,113 = 2013年1月,所以它不正确)
任何好的策略?
谢谢,
Schwartzian变换怎么样:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dump qw(dump);
my @list = (
'asdadasBBBsfasdasdas-0112',
'asdanfnfnfnfnf222ads-1210',
'asdanfnfnfnfnf222ads-1211',
'asdanfnfnfnfnf222ads-1010',
'asdanfnfnfnfnf222ads-1011',
);
my @sorted =
map { $_->[0] }
sort { $a->[1] <=> $b->[1] or $a->[2] <=> $b->[2] }
map { /-(\d\d)(\d\d)$/; [$_, $2, $1] } @list;
dump @sorted;
Run Code Online (Sandbox Code Playgroud)
输出:
(
"asdanfnfnfnfnf222ads-1010",
"asdanfnfnfnfnf222ads-1210",
"asdanfnfnfnfnf222ads-1011",
"asdanfnfnfnfnf222ads-1211",
"asdadasBBBsfasdasdas-0112",
)
Run Code Online (Sandbox Code Playgroud)
施瓦茨变换将是一个巨大的浪费.这个类似的结构,我永远不会记得的名字会更好.
my @sorted =
map substr($_, 4),
sort
map substr($_, -2) . substr($_, -4, 2) . $_,
@unsorted;
Run Code Online (Sandbox Code Playgroud)
使用匹配运算符而不是substr:
my @sorted =
map substr($_, 4),
sort
map { /(..)(..)\z/s; $2.$1.$_ }
@unsorted;
Run Code Online (Sandbox Code Playgroud)