數組我有一個元素排序在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
任何人都可以請幫忙。由於
數組我有一個元素排序在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
任何人都可以請幫忙。由於
這是另一種使用情況,其中來自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
嘗試是這樣的:
#!/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;
}
使用自定義比較函數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;
下面是做到這一點的方法之一。
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
'/ _ | x /'寫得比較好'/ [_ x] /'。 – TLP
@TLP感謝您的觀察。我修好了它。 –
元素由第一排序,並以升序第二數目,
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
這是因爲'64之前排序時按字母順序'128'來'。您可能對此感興趣:http://stackoverflow.com/q/19544253/725418 – TLP
但是我怎麼能做到這一點的數組? – Newbie
同樣的方法。您對元素列表進行排序,而不是數據結構。 – TLP