1

我有一个带有以下示例值的 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')。

任何帮助是极大的赞赏。

4

1 回答 1

6

解决您的问题的最佳方法是将所有英制度量单位更改为公制单位。

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

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
于 2013-08-15T00:48:52.290 回答