如何解决使用 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 strict
和 use warnings
始终是一个好主意。解决他们向您展示的问题会更好。
[*] 迂腐,你不能对散列进行排序。 FAQ 代码实际上是在生成一个经过排序的哈希键列表。
[**] 虽然你实际上有一个数组,而不是一个列表。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。