如何在不使用Perl中的$ b(比较)$ a的情况下对一个键升序进行排序,另一个降序排序?

Pau*_*ce. 2 sorting perl perl-critic

在Perl中,我可以这样做:

my @unit_indices = sort { 
    $units{$b}[0] <=> $units{$a}[0] 
        or
    $a cmp $b
} keys %units;
Run Code Online (Sandbox Code Playgroud)

哪个按字段(数组元素)降序排序,另一个(散列键)按升序排序,但会导致perlcritic抱怨:

禁止在第X行第Y列的排序块$ a之前的$ b.参见PBP的第152页.(严重程度:1)

Perl Best Practices建议使用reverse.

但如果你写的话,操作会更容易理解:
@sorted_results = reverse sort @unsorted_results;

但是,我还没有找到一种让方向相反的子方法.

显然,我可以说perlcritic要忽略这一点,但我想知道如何完成我需要的事情并使之perlcritic快乐.

Sch*_*ern 9

Perl ::批评者有时更关心的是准确复制PBP而不是提出良好的政策,而且一些Perl最佳实践并没有很好地老化.例如,现在可悲的过时Miscellanea :: RequireRcsKeywords默认仍然打开.

Perl :: Critic的政策不应被视为佳能.他们缺乏进行主观分析的能力来决定"修复"是否实际上会增加复杂性,特别是当严重程度下降并且收益变得更窄和更窄时. BuiltinFunctions :: ProhibitReverseSortBlock是一个"整容"级别的政策,完全属于这一类.

虽然有人可能会跳过$b cmp $a并向后阅读它,但是一旦正确看待并不难理解,不值得在之后反转整个数组的开销,并且肯定不值得扭曲你的排序块以匹配策略分析的局限性.他们决定不改变默认行为以将策略限制为简单排序块是IMO不正确的.您的排序块显然超出了书面策略的范围,只是因为Perl :: Critic的策略实现有限而触发.

仅仅因为Perl :: Critic在默认情况下有一个政策并不意味着它们代表了良好的实践,也不应该盲目地遵循它们.随意配置它符合您项目的品味,以最挑剔的级别运行Perl :: Critic需要它.为了防止使perlcritic成为一种习惯性的东西,我建议更倾向于在整个项目范围内制定政策决策,.perlcritic逐个逐行地将它们逐个关闭.

请记住,重点不在于perlcritic快乐,重点是编写更好的代码.