Perl中的数组排序

mkh04yzy  于 2023-08-06  发布在  Perl
关注(0)|答案(4)|浏览(128)

我想我可以按照下面的方式来做。然而,当我这样排序时,输出的是十六进制值,而不是指向array @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 $_;

    }

字符串

t98cgbkg

t98cgbkg1#

您的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

ncecgwcz

ncecgwcz2#

curlies的内容需要是一个表达式,该表达式返回元素$a是否应该出现在最终结果中的元素$b之前。详情请参见perldoc -f sort
由于这些元素是散列引用,并且您希望根据其中键item的字符串值进行排序,因此需要加载该值以进行比较

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

字符串

x6h2sr28

x6h2sr283#

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";
}

tyky79it

tyky79it4#

参见List::UtilsBy

use List::UtilsBy 'sort_by';

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

字符串

相关问题