按mmyy排序(月和年)

sno*_*kin 5 sorting perl

我正在寻找一个逻辑(不是附加模块)来按这种格式排序.我有一个字符串列表,看起来像:

asdadasBBBsfasdasdas-0112
asdanfnfnfnfnf222ads-1210
Run Code Online (Sandbox Code Playgroud)

我不能按数字排序,因为,例如:812> 113(812 = 2012年8月,113 = 2013年1月,所以它不正确)

任何好的策略?

谢谢,

Tot*_*oto 5

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)


ike*_*ami 5

施瓦茨变换将是一个巨大的浪费.这个类似的结构,我永远不会记得的名字会更好.

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)