所以,例如我有这样的数组:
s/ˇ/\n/g
我需要在\ t之后按第二列对此数组进行排序,而不进行外部拆分。有可能吗?
答案 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";
我使用了以下技术进行排序
非破坏性修饰符(-r) - 执行非破坏性替换并返回新值
并确认了数字
的警告