如何按Perl中的大小(英尺和英寸)对数组进行排序?

时间:2013-08-15 00:23:24

标签: perl sorting

我有一个带有以下示例值的perl数组:

multiple_sizes[0] = 10' 0" x 14' 0":6342
multiple_sizes[1] = 2' 0" x 3' 0":0
multiple_sizes[2] = 4' 0" x 6' 0":829
multiple_sizes[3] = 6' 0" x 9' 0":2022
multiple_sizes[4] = 8' 0" x 10' 0":3145
multiple_sizes[5] = 9' 0" x 12' 0":4821

对象是按升序宽度对这些值进行排序。问题是10'0“在2'0”之前排序,并且(未示出),2'10'在2'6'之前排序。

有没有办法让数组排序,以便结果给出一个递增的宽度?我想知道是否有办法将宽度视为两位数字,如果第二个数字不存在,则将其排序为一个(即2'变为02',10'变为10')。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

您问题的最佳解决方案是将所有英制度量更改为指标。

除此之外,您可以使用Schwartzian transform。只需捕获并存储与英寸和英尺对应的字符串中的前两个数字,并在排序中使用它们:

use strict;
use warnings;

my @size;
$size[0] = qq#10' 0" x 14' 0":6342#;
$size[1] = qq#2' 0" x 3' 0":0#;
$size[2] = qq#4' 0" x 6' 0":829#;
$size[3] = qq#6' 0" x 9' 0":2022#;
$size[4] = qq#8' 0" x 10' 0":3145#;
$size[5] = qq#9' 0" x 12' 0":4821#;

@size = map $_->[0],
    sort { $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] }
    map { [ $_, /^(\d+)'\s+(\d+)"/ ] } @size;

print "$_\n" for @size;

<强>输出:

2' 0" x 3' 0":0
4' 0" x 6' 0":829
6' 0" x 9' 0":2022
8' 0" x 10' 0":3145
9' 0" x 12' 0":4821
10' 0" x 14' 0":6342