2011-10-18 80 views
1

這裏的陣列的列表是腳本如何排序陣列

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)); 

我想通過匿名數組的第一個元素列表@Results排序列表中的元素指着

這給出錯誤

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

sortF函數應該如何寫入?

回答

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"; 
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); 

而這也正是該錯誤消息的來源。

2

除了問題mentioned by mu is too short${@$a}[0]不做你可能認爲它會這樣做:它試圖使用@$a數組的大小作爲數組引用,生成您看到的警告。我假設你的意思是$a->[0](或$$a[0],如果你喜歡舊式的解引用語法)。

此外,my @parsedLine = ['0x1a',"hello"];並不完全符合您的看法:它會創建一個包含對兩個字符串數組的引用的單元素數組。這在這裏並不重要(當你將一個數組推到另一個時,所有的元素都是按順序推送的),但它可能會在稍後咬你。