我正在寻找一种很好的方法来首先按值排序Perl,然后按键排序.
例:
my %userids = (
williams => "Marketing",
smith => "Research",
johnson => "Research",
jones => "Marketing",
brown => "Marketing",
davis => "Research"
);
Run Code Online (Sandbox Code Playgroud)
输出:
Marketing: brown
Marketing: jones
Marketing: williams
Research: davis
Research: johnson
Research: smith
Run Code Online (Sandbox Code Playgroud)
请注意,值是第一个排序级别.第二个排序级别是关键.知道如何以优雅和高性能的方式做到这一点吗?谢谢!
seh*_*ehe 27
很好的参考:http://www.misc-perl-info.com/perl-sort.html#shv
#!/usr/bin/perl
my %userids = (
williams => "Marketing",
smith => "Research",
johnson => "Research",
jones => "Marketing",
brown => "Marketing",
davis => "Research"
);
foreach (sort { ($userids{$a} cmp $userids{$b}) || ($a cmp $b) } keys %userids)
{
print "$_: $userids{$_}\n";
}
Run Code Online (Sandbox Code Playgroud)
我想补充一点,用于\L sequence排序.
从Perlfaq4:我如何排序哈希(可选择按值而不是键)?
为了使我们的报表顺序不区分大小写,我们使用\L sequence双引号字符串将所有内容都设置为小写.sort()然后该块比较较低的值以确定放置键的顺序.
foreach (sort { $userids{$a} cmp $userids{$b} or "\L$a" cmp "\L$b" ) {
print "$_: $userids{$_}\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:
brown: Marketing
jones: Marketing
williams: Marketing
davis: Research
Johnson: Research # here 'J'ohnson, J is in uppercase(taking assumption), come as fifth record
smith: Research
Run Code Online (Sandbox Code Playgroud)
2.
foreach (sort { $userids{$a} cmp $userids{$b} or $a cmp $b ) {
print "$_: $userids{$_}\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:
brown: Marketing
jones: Marketing
williams: Marketing
Johnson: Research # here it shifted to fourth record
davis: Research
smith: Research
Run Code Online (Sandbox Code Playgroud)