我以为我可以按照下面说明的方式来做。但是,当我按这种方式对其进行排序时,输出是十六进制值中的值,而不是指向数组@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 $_;
}
答案 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;