我有一个带有以下示例值的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')。
非常感谢任何帮助。
答案 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