字符串数组的自定义排序

时间:2016-06-09 08:35:51

标签: perl sorting

我有一个包含多行的文本文件

abc 122 aaaaaaa
cba 165 aaaaaaaa
aaa 123 aaaaaaaaa
bvc 443 aaaaaaaaaa
rdc 993 aaaaaaaaaaa
qwe 103 aaaaaaaaaaaa

每行包含一个十进制数字。 我可以使用十进制数作为排序标记对这一行进行排序吗?

我想做类似的事情,但这段代码无效。

for my $line (sort @lines {(($a =~ /(\d+)/)[0]) <=> (($b =~ /(\d+)/)[0])}) {
    print $line;
}

4 个答案:

答案 0 :(得分:2)

来自List::UtilsBynsort_by函数以更易读的形式包装它。它也很快,因为它是用C语言编写的

use strict;
use warnings 'all';

use List::UtilsBy 'nsort_by';

my @data = <DATA>;

print for nsort_by { (split)[1] } @data;


__DATA__
abc 122 aaaaaaa
cba 165 aaaaaaaa
aaa 123 aaaaaaaaa
bvc 443 aaaaaaaaaa
rdc 993 aaaaaaaaaaa
qwe 103 aaaaaaaaaaaa

输出

qwe 103 aaaaaaaaaaaa
abc 122 aaaaaaa
aaa 123 aaaaaaaaa
cba 165 aaaaaaaa
bvc 443 aaaaaaaaaa
rdc 993 aaaaaaaaaaa

答案 1 :(得分:1)

试试这个:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsChecked" Value="True" />
        <Condition Property="IsEnabled" Value="False" />
    </MultiTrigger.Conditions>
    <MultiTrigger.Setters>
        <Setter Property="Background" TargetName="Innerborder" Value="#FFFF0000"/>
        <Setter Property="BorderBrush" TargetName="Innerborder" Value="#FF295B2E"/>
    </MultiTrigger.Setters>
</MultiTrigger>

答案 2 :(得分:1)

原始代码中唯一的问题是您的sort参数的顺序错误。 sort期望(可选)排序块后跟要排序的项目列表。您有一个项目列表(@lines),后跟排序块。扭转这些将解决您的问题。

#!/usr/bin/perl

use strict;
use warnings;

my @lines = <DATA>;

for my $line (sort {(($a =~ /(\d+)/)[0]) <=> (($b =~ /(\d+)/)[0])} @lines) {
    print $line;
}

__DATA__
abc 122 aaaaaaa
cba 165 aaaaaaaa
aaa 123 aaaaaaaaa
bvc 443 aaaaaaaaaa
rdc 993 aaaaaaaaaaa
qwe 103 aaaaaaaaaaaa

通常情况下,添加use strict会显示此处存在问题。

答案 3 :(得分:0)

试试这个。

将分组元素存储在临时变量中,并从该变量执行排序。

use warnings;
use strict;
my @ar = <DATA>;
my $m;
my $n;
foreach (sort{ ($m)=$a=~/(\d+)/; ($n)=$b=~/(\d+)/; $m <=>$n } @ar)
{
    print "$_";

}


__DATA__
abc 122 aaaaaaa
cba 165 aaaaaaaa
aaa 123 aaaaaaaaa
bvc 443 aaaaaaaaaa
rdc 993 aaaaaaaaaaa
qwe 103 aaaaaaaaaaaa