使用分隔符分隔非标准长度的数组

时间:2014-03-25 15:37:30

标签: arrays perl sorting

所以,我有一个这样的数组my @array= ( '1/22', '1/3', '1/15', '1/24', '2/1', '3/47' ); 排序时应显示为1 / 3,1 / 15,1 / 22,1 / 24,2 / 1,3 / 47。但是,根据我在perl中的研究,我对Schwartzian变换或sort命令的尝试导致1/22将在1/3之前出现的问题。

这对我没有任何意义,因为join命令会导致13,(如果我理解正确的话)应该在122之前排序。

我使用的具体行是@array= sort { join('', (split '/', $a)[0,1]) cmp join('', (split '/', $b)[0,1]) } @array

我到底需要做些什么?我认为这种情况也应该因为类似的原因而失败,例如2/4。

2 个答案:

答案 0 :(得分:5)

sort { 
    my @a = split('/', $a); 
    my @b = split('/', $b); 
    $a[0] <=> $b[0] or 
    $a[1] <=> $b[1]; } @list

答案 1 :(得分:1)

使用Sort::Naturally是最简单的方法:

@array = Sort::Naturally::nsort(@array);

虽然要完成我认为您打算加入的内容,但您可以这样做:

sprintf('%02d%02d', (split '/', $a)[0,1]) cmp sprintf('%02d%02d', (split '/', $b)[0,1])

(如果需要,增加2的宽度)。