Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 按值和键对哈希进行排序(按该顺序)_Perl_Sorting_Hash - Fatal编程技术网

Perl 按值和键对哈希进行排序(按该顺序)

Perl 按值和键对哈希进行排序(按该顺序),perl,sorting,hash,Perl,Sorting,Hash,我正在寻找一种很好的方法,在Perl中先按值排序,然后按键排序 例如: my %userids = ( williams => "Marketing", smith => "Research", johnson => "Research", jones => "Marketing", brown => "Marketing", davis => "Research" ); 输出: Marketing: br

我正在寻找一种很好的方法,在Perl中先按值排序,然后按键排序

例如:

 my %userids = (
  williams => "Marketing",
  smith    => "Research",
  johnson  => "Research",
  jones    => "Marketing",
  brown    => "Marketing",
  davis    => "Research"
);
输出:

Marketing: brown
Marketing: jones
Marketing: williams
Research: davis
Research: johnson
Research: smith
brown: Marketing
jones: Marketing
williams: Marketing
Johnson: Research # here it shifted to fourth record
davis: Research
smith: Research
请注意,值是第一个排序级别。第二级排序是关键。你知道如何以优雅和高性能的方式实现这一点吗?谢谢

好的参考:


我想补充一点,在排序中使用
\L sequence

FromPerlfaq4:如何对哈希进行排序(可选按值而不是按键)

为了使报表顺序不区分大小写,我们在双引号字符串中使用
\L序列
,使所有内容都小写。然后,
sort()
块比较小写值以确定键的放置顺序

foreach (sort { $userids{$a} cmp $userids{$b} or "\L$a" cmp "\L$b" )  {
    print "$_: $userids{$_}\n"; 
} 
输出:

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
二,

输出:

Marketing: brown
Marketing: jones
Marketing: williams
Research: davis
Research: johnson
Research: smith
brown: Marketing
jones: Marketing
williams: Marketing
Johnson: Research # here it shifted to fourth record
davis: Research
smith: Research

我想说,从语义上讲,只有在将元素输入到散列中时才有意义。否则,当哈希同时包含Johnson和Johnson时,您将得到无法解释的结果。也就是说,在排序时,你很难说“键是等价的”——根据传统定义,哈希表不能包含两个等价键是的,真正的键在哈希中总是唯一的,从不包含两个等价键,但你可以看到输出中的差异。我可以看到输出中的差异。这就是为什么我认为这会是一件奇怪的事情:它违反了在我的视图中很少会发生的规则,但我认为添加它会很好:)