我有这样的字符串:
"PQR23 on abc62", "PQR112 on efg7", "PQR9 on efg76" and so on
现在我想安排这个字符串以第一个字符的数字按升序排列。
所以预期的输出应该是
PQR112 on efg7
PQR23 on abc62
PQR9 on efg76
等等
我是新来的perl,做作业和网上搜索,但到目前为止还没有收到完美的解决方案。 感谢。
答案 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