2013-10-25 30 views
0

數組我有一個元素排序在Perl

@a =(mem_64x128,mem_8x64,mem_8x128,mem_128x64); 

我想數組以下列方式

mem_8x64,mem_8x128,mem_64x128,mem_128x64 

進行排序但當我sort @a,輸出我得到的是

數組
mem_128x64 
mem_64x128 
mem_8x64 
mem_8x128 

任何人都可以請幫忙。由於

+1

這是因爲'64之前排序時按字母順序'128'來'。您可能對此感興趣:http://stackoverflow.com/q/19544253/725418 – TLP

+0

但是我怎麼能做到這一點的數組? – Newbie

+0

同樣的方法。您對元素列表進行排序,而不是數據結構。 – TLP

回答

2

這是另一種使用情況,其中來自CPAN模塊作爲人類預期Sort::Naturally工作的nsort功能吧:

@a =(mem_64x128,mem_8x64,mem_8x128,mem_128x64); # no strict! 
use Sort::Naturally qw(nsort); 
print join(',', nsort @a), "\n"; 

輸出是:

mem_8x64,mem_8x128,mem_64x128,mem_128x64 
3

嘗試是這樣的:

#!/usr/bin/perl 
use strict; 
use warnings; 

my @a =("mem_64x128","mem_8x64","mem_8x128","mem_128x64"); 

print sort byFirst sort bySecond @a; 

sub byFirst{ 
# Extract first number from a 
my $y=$a; 
$y =~ s/.*_//; 
$y =~ s/x.*//; 

# Extract first number from b 
my $z=$b; 
$z =~ s/.*_//; 
$z =~ s/x.*//; 
return $y <=> $z; 
} 

sub bySecond{ 
# Extract second number from a 
my $y=$a; 
$y =~ s/.*x//; 

# Extract second number from b 
my $z=$b; 
$z =~ s/.*x//; 
return $y <=> $z; 
} 
4

使用自定義比較函數sort (perldoc)

sort { 
    my ($c,$d) = $a =~ /(\d+)x(\d+)/; 
    my ($e,$f) = $b =~ /(\d+)x(\d+)/; 
    $c<=>$e || $d<=>$f; 
} @a; 

或更快的一個:

my %h; 
@a = sort { 
    $h{$a} || (@{$h{$a}} = $a =~ /(\d+)x(\d+)/); 
    $h{$b} || (@{$h{$b}} = $b =~ /(\d+)x(\d+)/); 
    $h{$a}->[0] <=> $h{$b}->[0] || $h{$a}->[1] <=> $h{$b}->[1]; 
} @a; 
2

下面是做到這一點的方法之一。

use warnings; 
use strict; 


my @a = ('mem_64x128', 'mem_8x64', 'mem_8x128', 'mem_128x64'); 

my @sorted_a = sort { (split /[_x]/, $a)[1] <=> (split /[_x]/, $b)[1] 
          or 
      (split /[_x]/, $a)[2] <=> (split /[_x]/, $b)[2] 
} @a; 

print "$_\n" foreach @sorted_a; 

OUTPUT

mem_8x64 
mem_8x128 
mem_64x128 
mem_128x64 
+1

'/ _ | x /'寫得比較好'/ [_ x] /'。 – TLP

+0

@TLP感謝您的觀察。我修好了它。 –

1

元素由第一排序,並以升序第二數目,

my @r = qw(mem_64x128 mem_8x64 mem_8x128 mem_128x64); 

@r = map { $_->[0] } 
    sort { 
    $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] 
    } 
    map { [$_, /(\d+)/g ] } @r; 

print "@r\n"; 

輸出

mem_8x64 mem_8x128 mem_64x128 mem_128x64