2015-03-16 4 views
1

Я думал, что смогу сделать это так, как было сказано ниже. Однако, когда я сортирую его таким образом, вывод - это значения в шестнадцатеричных значениях, а не строка, указывающая на «элемент» в массиве @menu. То, что я хочу добиться того, чтобы отсортировать его «пункт-наме»Сортировка массива в Perl

my @menu = (
     { item => "Blazer", price => 100, color => "Brown" }, 
     { item => "Jeans", price => 50, color => "Blue" }, 
     { item => "Shawl", price => 30, color => "Red" }, 
     { item => "Suit", price => 40, color => "Black" }, 
     { item => "Top", price => 25, color => "White" }, 
    );  

    my @test = sort {item } @menu; 

    foreach (@test){ 
    print $_; 

    } 

ответ

3

Ваш print $_ печатает значение строки каждой ссылки на хэш, так что вы получите что-то вроде HASH(0x1d33524). Вам нужно распечатать поля каждого хеша, который вас интересует.

Кроме того, вам нужно правильное выражение сравнения внутри блока sort. Просто указание имени хэш-ключа ничего не принесет.

use strict; 
use warnings; 

my @menu = (
    { item => 'Blazer', price => 100, color => 'Brown' }, 
    { item => 'Jeans', price => 50, color => 'Blue' }, 
    { item => 'Shawl', price => 30, color => 'Red' }, 
    { item => 'Suit', price => 40, color => 'Black' }, 
    { item => 'Top', price => 25, color => 'White' }, 
); 

my @test = sort { $a->{item} cmp $b->{item} } @menu; 

for (@test) { 
    print "@{$_}{qw/ item price color /}\n"; 
} 

выход

Blazer 100 Brown 
Jeans 50 Blue 
Shawl 30 Red 
Suit 40 Black 
Top 25 White 

Update

Если все, что вы хотите это упорядоченный список значений полей элемент, то вы можете написать это более просто

use strict; 
use warnings; 

my @menu = (
    { item => 'Blazer', price => 100, color => 'Brown' }, 
    { item => 'Jeans', price => 50, color => 'Blue' }, 
    { item => 'Shawl', price => 30, color => 'Red' }, 
    { item => 'Suit', price => 40, color => 'Black' }, 
    { item => 'Top', price => 25, color => 'White' }, 
); 

my @test = sort map { $_->{item} } @menu; 

print "$_\n" for @test; 

выход

Blazer 
Jeans 
Shawl 
Suit 
Top 
0

Первый аргумент sort BLOCK LIST является блок, который сравнивает два члена списка, а не так, как извлечь вещи для сравнения. См. sort.

my @test = sort { $a->{item} cmp $b->{item} } @menu; 

Sort::Key позволяет определить «что для сортировки», а не «как сравнить элементы».

use Sort::Key qw{ keysort }; 
# ... 
my @test = keysort { $_->{item} } @menu; 

В своем коде без strict, строка "item" используется для сравнения элементов, которые на самом деле не меняют порядок в любом случае. То, что вы видите на выходе, представляет собой представление элементов массива, то есть хеш-ссылок. Если вы хотите видеть только элементы, используйте

for (@test) { 
    print $_->{item}, "\n"; 
} 
0

Содержание фигурной скобки должно быть выражением, которое возвращает ли элементы в $a должны появляться перед элементом в $b в конечном итоге.

Элементы, в данном случае, являются ссылками на хеши. Вы хотите сравнить item элемент этих хэшей, так

sort { $a->{item} cmp $b->{item} } 
0

Смотрите также List::UtilsBy:

use List::UtilsBy 'sort_by'; 

my @test = sort_by { $_->{item} } @menu; 
Смежные вопросы