在Perl中排序数组

时间:2015-03-16 15:07:07

标签: arrays perl sorting

我以为我可以按照下面说明的方式来做。但是,当我按这种方式对其进行排序时,输出是十六进制值中的值,而不是指向数组@menu中的“item”的字符串。我想要实现的是按“item-name”

对其进行排序
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 $_;

    }

4 个答案:

答案 0 :(得分: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

<强>更新

如果你想要的只是项目字段值的排序列表,那么你可以更简单地写这个

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

答案 1 :(得分: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";
}

答案 2 :(得分:0)

curlies的内容需要是一个表达式,它返回$a中的元素是否应出现在最终结果中$b中的元素之前。

在这种情况下,元素是对哈希的引用。您想要比较这些哈希的item元素,所以

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

答案 3 :(得分:0)

另见List::UtilsBy

use List::UtilsBy 'sort_by';

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