2013-05-06 38 views
6

varsayalım ikinci dizinin elemanlarına göre bir dizi:sıralama Ben şuna benzer iki diziler var

('1', '6', '8', '4', '5') 
('a', 'c', 'd', 'f', 'w') 

Ben ilk dizi ve değişmelidir ikinci dizideki öğelerin sırasını sıralamak istediğiniz Perl bunu nasıl

('1', '4', '5', '6', '8') 
('a', 'f', 'w', 'c', 'd') 

Herhangi fikir şu şekildedir: ilk dizi olarak aynı şekilde, bu yüzden ikisinin sipariş haline gelir?

cevap

10

Diziye göstergelerini sıralamanız gerekir. Bu

use strict; 
use warnings; 

my @aa = qw/ 1 6 8 4 5 /; 
my @bb = qw/ a c d f w /; 

my @idx = sort { $aa[$a] <=> $aa[$b] } 0 .. $#aa; 

@aa = @aa[@idx]; 
@bb = @bb[@idx]; 

print "@aa\n"; 
print "@bb\n"; 

çıkışı gibi

1 4 5 6 8 
a f w c d 
+1

@Abdel ev ödevi gibi mi görünüyor? :) –

+0

Haha, hayır bu ev ödevi değil, sadece sahip olduğum gerçek bir sorunu basitleştirdim :) Cevabınız için teşekkürler, mükemmel çalışıyor! – Abdel

+0

$ a ve $ b nedir? 0 nedir? –

2

Borodin cevabı Sorunuzun mükemmel ve en Perlish yanıttır. Verilerinizin yapısının bir karma kullanımının olabileceğini düşündürmektedir, bu nedenle, verileri bir karma yoluyla ilişkilendirmek ve bu şekilde sıralamak için bir örnek verilmiştir.

use strict; 
use warnings; 
use List::MoreUtils qw(mesh); 

my @aa = qw/ 1 6 8 4 5 /; 
my @bb = qw/ a c d f w /; 

my %x = mesh @aa, @bb; 
print join(" ", sort keys %x), "\n"; 
print join(" ", @x{sort keys %x}), "\n"; 
3

Bir hash kullanabilirsiniz. İlk dizideki değerleri ikinci diziden alınan değerlere anahtar olarak kullanın. Sonra sadece bir foreach my $key (sort keys %the_hash) { do stuff } yapın. Eğer anahtar değerler benzersiz değilse, o zaman bir diziler dizisi kullanarak ve değerleri hash esasına doğru iterek.

#! perl 
use strict; 
use warnings; 

my @key_data = ('1', '6', '8', '4', '5', '4', '5'); 
my @val_data = ('a', 'c', 'd', 'f', 'w', 'z', 'w'); 

my %the_hash; 

for (my $ii=0; $ii<=$#key_data; $ii++) { 
    push @{$the_hash{$key_data[$ii]}}, $val_data[$ii]; 
} 

for my $key (sort keys %the_hash) { 
    print "key $key\n"; 
    foreach my $val (@{$the_hash{$key}}) { 
     print "  $val\n"; 
    } 
} 
İlgili konular