如何通过substring,perl对数组进行排序

时间:2017-03-24 11:37:20

标签: perl sorting substring

所以,例如我有这样的数组:

s/ˇ/\n/g

我需要在\ t之后按第二列对此数组进行排序,而不进行外部拆分。有可能吗?

3 个答案:

答案 0 :(得分:2)

可能是一种更优雅的方式,但这可行:

my @arr = ( "blabla\t23\t55", "jkdcbx\t55\t89", "jdxjcl\t88\t69");
for (sort {(split(/\t/,$a))[2] <=> (split(/\t/,$b))[2]} @arr) {
    print "$_\n";
}

答案 1 :(得分:1)

更新

我刚刚意识到您的问题可能意味着您希望按第三个​​列而不是第二个

列进行排序

这可以通过使用

来完成
my ($aa, $bb) = map { (split /\t/)[2] } $a, $b;

代替

输出

blabla  23  55
jdxjcl  88  69
jkdcbx  55  89


我总是喜欢使用map将原始数据中的值转换为应按

排序的函数

该程序演示

我假设您希望数值按数字排序?不幸的是,您的示例数据已经按照您的描述进行了排序

use strict;
use warnings 'all';
use feature 'say';

my @arr = (
    "blabla\t23\t55",
    "jkdcbx\t55\t89",
    "jdxjcl\t88\t69",
);


my @sorted = sort {
    my ($aa, $bb) = map { (split /\t/)[1] } $a, $b;
    $aa <=> $bb;
} @arr;

say for @sorted;

输出

blabla  23  55
jkdcbx  55  89
jdxjcl  88  69

答案 2 :(得分:1)

试试这个

use warnings;
use strict;
no warnings "numeric";

my @arr = (
"blabla\t23\t55",
"jkdcbx\t85\t89",
"jdxjcl\t83\t69",
);

my @result = sort {$a=~s/^[^\t]*\t//r <=> $b=~s/^[^\t]*\t//r } @arr;

$, = "\n";

print @result,"\n";

我使用了以下技术进行排序

Negation character class

  

非破坏性修饰符(-r) - 执行非破坏性替换并返回新值

并确认了数字

的警告