2015-05-18 2 views
4

Я несколько новичок в perl, поэтому, пожалуйста, несите меня. Я исчерпал все возможные решения, которые я смог найти до сих пор.perl sort 2d массив со ссылками

Предположим, у меня есть шляпы с некоторыми измерениями, которые заполнены в другом месте. И я хочу сортировать их на основе определенной колонки. Я пытаюсь сделать это, используя «сортировку» perl, но я не могу их сортировать. Я считаю, что проблема в том, что я запутался в ссылках. Ниже приведен код, с которым я сейчас работаю.

my @hat1 = [3, 4, 5, 6, 7, 8]; 
my @hat2 = [4, 6, 5, 1, 1, 2]; 
my @hat3 = [9, 8, 9, 3, 4, 4]; 
#eventually work with unknown number of hats 

my @binToSort = (\@hat1,\@hat2,\@hat3); 

my @binSorted = sort { $a->[4] <=> $b->[4] } @binToSort; 

for my $ref (@binSorted){ 
    for my $inner (@$ref){ 
     print "@$inner\n"; 
    } 
} 

В настоящее время он печатает несортированные массив значений:

3 4 5 6 7 8 
4 6 5 1 1 2 
9 8 9 3 4 4 

Но я хочу, чтобы иметь возможность прийти:

4 6 5 1 1 2 
9 8 9 3 4 4 
3 4 5 6 7 8 

Я чувствую, что это простая задача но я не могу понять, как это сделать. Любая помощь высоко ценится!

+5

Подсказка: включить предупреждения с 'предупреждения использования;' и вы получите 'Использование неинициализированного значения в числовом сравнения (<=>)' Думай о том, почему '$ a -> [4]' и '$ b -> [4]' могут быть не определены. – ThisSuitIsBlackNot

+4

и при необходимости добавить 'use Data :: Dumper; print Dumper \ @binToSort; ' – ysth

+3

Теперь я вижу предупреждения, спасибо. И 'print Dumper \ @binToSort;' дает мне '$ VAR1 = [[[3,4,5,6,7,8]], [[4,6,5,1,1,2]], [[ 9,8,9,3,4,4]]]; '(в виде столбцов). Эти двойные скобки ... это красный флаг? – imomushi8

ответ

3

Понадобится:

my $hat1 = [ 3, 4, 5, 6, 7, 8 ]; 
my $hat2 = [ 4, 6, 5, 1, 1, 2 ]; 
my $hat3 = [ 9, 8, 9, 3, 4, 4 ]; 

#eventually work with unknown number of hats 

my @binToSort = ($hat1, $hat2, $hat3); 

my @binSorted = sort { $a->[4] <=> $b->[4] } @binToSort; 

for my $ref (@binSorted) { 
    for my $inner (@{$ref}) { 
     print "$inner"; 
    } 
    print "\n"; 
} 

Или

my @hat1 = (3, 4, 5, 6, 7, 8); 
my @hat2 = (4, 6, 5, 1, 1, 2); 
my @hat3 = (9, 8, 9, 3, 4, 4); 

#eventually work with unknown number of hats 

my @binToSort = (\@hat1, \@hat2, \@hat3); 

my @binSorted = sort { $a->[4] <=> $b->[4] } @binToSort; 

for my $ref (@binSorted) { 
    for my $inner (@{$ref}) { 
     print "$inner"; 
    } 
    print "\n"; 
} 
+0

Большое спасибо! И я ценю, что вижу два разных способа сделать это. – imomushi8