这是脚本
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函数?
答案 0 :(得分:3)
您正在此处致电sortF
:
my @sortedresults = sort(sortF(@results));
当您打算告诉sort
使用sortF
作为比较函数时:
my @sortedresults = sort sortF @results;
您正在做的是先调用sortF(@results)
并将该函数调用的结果传递给sort
。但$a
和$b
中的sortF
和sort
都是空的,因为$l1
尚未设置它们,这意味着$l2
和$l1 <=> $l2
将为空,my @sortedresults = sort(sortF(@results));
将为零。所以你的
my @sortedresults = sort(0);
变为:
{{1}}
这就是错误消息的来源。
答案 1 :(得分:3)
您在使用引用时犯了一些小错误,您应该查看perlref和perlsort了解有关操作的详细信息:
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"];
并没有像你认为的那样做:它创建了一个包含对两个字符串数组的引用的单元素数组。这实际上并不重要(当你将数组推到另一个数组上时,所有元素都按顺序推送),但它可能会在以后咬你。