【问题标题】:Sorting Array in PerlPerl中的排序数组
【发布时间】:2015-05-18 18:25:09
【问题描述】:

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

    }

【问题讨论】:

    标签: arrays perl sorting


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          另见List::UtilsBy

          use List::UtilsBy 'sort_by';
          
          my @test = sort_by { $_->{item} } @menu;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-01-14
            • 2011-07-14
            • 2019-04-10
            • 2011-02-25
            • 2011-12-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多