2016-01-14 172 views
2

我想對數組進行排序並將特定元素放在開頭。Perl自定義排序

這裏是我的代碼:

sub MySort { 
    my $P = 'node'; 
    if ($a eq $P) { 
     return -1; 
    } 

    return -1 if $a lt $b; 
    return 0 if $a eq $b; 
    return 1 if $a gt $b; 
} 

my @x = qw (abc def xxx yyy ggg mmm node); 
print join "\n",sort MySort @x 

我想到「節點」去年初,但它不工作。

結果:

abc 
def 
ggg 
node 
mmm 
xxx 
yyy 

預期結果:

node 
abc 
def 
ggg 
mmm 
xxx 
yyy 

回答

5

你錯過情況下,當$bnode

sub MySort {  
    my $P = 'node'; 
    return 0 if $a eq $P && $b eq $P; 
    return -1 if $a eq $P; 
    return +1 if $b eq $P; 
    return $a cmp $b; 
} 

my @x = qw (abc def xxx yyy ggg mmm node); 
my @a = sort MySort @x; 

或者:

sub MySort {  
    my $P = 'node'; 
    return ($a eq $P ? 0 : 1) <=> ($b eq $P ? 0 : 1) 
     || $a cmp $b; 
} 
+1

你錯過了其中兩個'$了'和'$ B'的情況下'節點'。固定。 – ikegami

2

如果你不想寫這種手工的東西,你可以用Sort::ByExample,這是專門用來預定義值的列表排序,前如果它們出現的話,將其餘部分按你喜歡的方式排序。對於你的例子:

use Sort::ByExample; 
my $sorter = Sort::ByExample->sorter(
    ['node'], 
    sub { $_[0] cmp $_[1] } 
); 
my @x = qw (abc def xxx yyy ggg mmm node); 
print join "\n", $sorter->(@x); 

或者,如果你真的想你可以用sort內置使用子:

use Sort::ByExample; 
my $mysort = Sort::ByExample->cmp(
    ['node'], 
    sub { $_[0] cmp $_[1] } 
); 
my @x = qw (abc def xxx yyy ggg mmm node); 
print join "\n", sort $mysort @x; 
+0

感謝您的回答!但我更喜歡@mnile,因爲它可以被移植到其他語言 – Boying