用perl中的数字排序字符串

时间:2012-04-13 06:16:00

标签: perl sorting

我有这样的字符串:

"PQR23 on abc62", "PQR112 on efg7", "PQR9 on efg76" and so on

现在我想安排这个字符串以第一个字符的数字按升序排列。

所以预期的输出应该是

PQR112 on efg7
PQR23 on abc62
PQR9 on efg76 

等等

我是新来的perl,做作业和网上搜索,但到目前为止还没有收到完美的解决方案。 感谢。

3 个答案:

答案 0 :(得分:3)

我不确定你想要的是一个简单的词法排序没有提供。下面的程序似乎按照您的指定进行。

use strict;
use warnings;

my @strings = (
  "PQR23 on abc62",
  "PQR112 on efg7", 
  "PQR9 on efg76",
);

print "$_\n" for sort @strings;

<强>输出

PQR112 on efg7
PQR23 on abc62
PQR9 on efg76

修改

如果你想忽略前缀字母,那么排序的代码块就可以了解

use strict;
use warnings;

my @strings = (
  "ABC23 on abc62",
  "PQR112 on efg7", 
  "XYZ9 on efg76",
);

print "$_\n"  for sort {
  my ($aa) = $a =~ /(\d)/;
  my ($bb) = $b =~ /(\d)/;
  $aa cmp $bb;
} @strings;

<强>输出

PQR112 on efg7
ABC23 on abc62
XYZ9 on efg76

答案 1 :(得分:2)

你也可以这样使用Schwartzian Transform,如果你的数组很大,效率非常高:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @strings = (
  "PQR23 on abc62",
  "PQR112 on efg7", 
  "PQR9 on efg76",
);

my @result = 
    map { $_->[0] }
    sort { $a->[1] <=> $b->[1]}
    map { [$_, /(\d)/] }
    @strings;

print Dumper\@result;

输出

$VAR1 = [
          'PQR112 on efg7',
          'PQR23 on abc62',
          'PQR9 on efg76'
        ];

答案 2 :(得分:0)

use strict;
use warnings;
my @sorted_strings=sort("PQR23 on abc62", "PQR112 on efg7", "PQR9 on efg76");
print join ("\n",@sorted_strings);

输出

PQR112 on efg7
PQR23 on abc62
PQR9 on efg76