如何对数组数组列表进行排序

时间:2011-10-18 02:13:07

标签: arrays perl sorting

这是脚本

use strict;

sub sortF {
my $l1 = hex ${@$a}[0];
my $l2 = hex ${@$b}[0];
return $l1 <=> $l2;
}

my @results;

my @parsedLine = ['0x1a',"hello"];
push(@results, @parsedLine);

my @parsedLine2 = ['0x1b',"ohello"];
push(@results, @parsedLine2);

my @sortedresults = sort(sortF(@results));

我想按列表元素指向的匿名数组的第一个元素对列表进行排序

这会给出错误

Can't use string ("0") as an ARRAY ref while "strict refs" in use at ...

如何编写sortF函数?

3 个答案:

答案 0 :(得分:3)

您正在此处致电sortF

my @sortedresults = sort(sortF(@results));

当您打算告诉sort使用sortF作为比较函数时:

my @sortedresults = sort sortF @results;

您正在做的是先调用sortF(@results)并将该函数调用的结果传递给sort。但$a$b中的sortFsort都是空的,因为$l1尚未设置它们,这意味着$l2$l1 <=> $l2将为空,my @sortedresults = sort(sortF(@results)); 将为零。所以你的

my @sortedresults = sort(0);

变为:

{{1}}

这就是错误消息的来源。

答案 1 :(得分:3)

您在使用引用时犯了一些小错误,您应该查看perlrefperlsort了解有关操作的详细信息:

use strict;

sub sortF {
    my $l1 = hex $a->[0]; # just use $arrayref->[index]
    my $l2 = hex $b->[0];
    return $l1 <=> $l2;
}

my @results;

my @parsedLine = ('0x1a',"hello"); # use () to make a list
push(@results, \@parsedLine); # but push an array ref

# or create an anon array ref with [] and push it immediately
push(@results, ['0x1b',"ohello"]); 

# here use the `sort SUBNAME LIST' syntax
my @sortedresults = sort sortF @results;

print join(":", map {$_->[1]} @sortedresults), "\n";

答案 2 :(得分:2)

除问题mentioned by mu is too short外,${@$a}[0]不会执行您认为可能执行的操作:它会尝试使用数组@$a size 数组引用,生成您看到的警告。我认为你的意思是$a->[0](或$$a[0]如果你喜欢旧式的解引用语法。)

此外,my @parsedLine = ['0x1a',"hello"];并没有像你认为的那样做:它创建了一个包含对两个字符串数组的引用的单元素数组。这实际上并不重要(当你将数组推到另一个数组上时,所有元素都按顺序推送),但它可能会在以后咬你。