微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 sort 对 Perl 中的哈希列表进行排序

如何解决使用 sort 对 Perl 中的哈希列表进行排序

   use Data::Dumper;
   
   sub byage {
           $age{$a} <=> $age{$b};  # presuming numeric
       }
          
  my @class = ( { student => "student1",age => 33,},{ student => "student2",age => 66,{ student => "student3",age => 44,);
  my @sortedclass = sort byage @class;
  
  print Dumper(@class);
  print Dumper(@sortedclass);

我正在尝试遵循 perldoc Sort 示例。 我想对哈希列表进行排序,至少在 perldoc 示例中,年龄键的值。 不确定我做错了什么。 以上似乎没有排序。

解决方法

您应该做的第一件事是将 use warnings; use strict; 放在代码的顶部,这样您就可以得到没有哈希 %age 的警告。

您想要比较 age$a 中的 $b 值。

sub byage {
    $a->{age} <=> $b->{age};  # presuming numeric
}

my @class = (
    { student => "student1",age => 33,},{ student => "student2",age => 66,{ student => "student3",age => 44,);
my @sortedclass = sort byage @class;
,

来自评论:

关于 $age{b} 的 perldocs 引用了什么数据结构

我认为您一直在查看 Perl 常见问题解答中的此条目 - How do I sort a hash (optionally by value instead of key)? 它包含以下示例:

my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;

排序表达式所指的数据结构是名为 %hash 的哈希。

当你为自己的代码借用那个例子时,你把它改成了这样:

sub byage {
  $age{$a} <=> $age{$b};  # presuming numeric
}

这是在寻找一个名为 %age 的哈希。但是在您的代码中没有任何地方有一个名为 %hash 的哈希。您有一个名为 @class 的数组。

这里有一些误解,但我认为最重要的是这一点。您正在查看的常见问题是关于对散列 [*] 进行排序(“我如何对散列进行排序...?”)但您想对列表 [**](“...的排序列表”)进行排序。列表(或数组)和散列是相当不同的数据结构,因此当您尝试对数组进行排序时,尝试使用用于散列的排序技术将毫无帮助。

sort() 函数对列表进行排序。你给它一个列表,它返回另一个。在 FAQ 示例中,输入列表是散列的键(使用 keys %hash 生成),输出列表是按不同顺序排序的相同键。在您的实际问题中,输入是一个散列引用数组,输出是一个以不同顺序排列的散列引用列表。

当你写一个排序表达式(或者,在你的例子中,一个排序子例程)时,你会在 $a$b 中得到输入列表的两个元素,然后你返回一个值,表明这两个元素如何值应该排序。在 FAQ 示例中,$a$b 将是键,您可以使用这些键查看散列($hash{$a}$hash{$b})并获取相关值。在您的问题中, $a$b 将是您输入数组中的两个哈希引用。您可以在那些($a->{age}$b->{age})范围内查找“年龄”键,以获取要比较的值。

正如其他人指出的那样。在您的代码中添加 use strictuse warnings 始终是一个好主意。解决他们向您展示的问题会更好。

[*] 迂腐,你不能对散列进行排序。 FAQ 代码实际上是在生成一个经过排序的哈希键列表。
[**] 虽然你实际上有一个数组,而不是一个列表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?