Perl::Critic at times will concern itself more with being an accurate reproduction of PBP than presenting good policy, and some of Perl Best Practices hasn't aged well. For example, the now woefully out of date Miscellanea::RequireRcsKeywords is still on by default.
Perl::Critic's policies shouldn't be treated as canon. They lack the ability to do subjective analysis to decide if the "fix" is actually going to increase complexity, particularly as the severity level drops and the benefits get narrower and narrower. BuiltinFunctions::ProhibitReverseSortBlock is a "cosmetic" level policy and falls squarely into this category.
While somebody might skip $b cmp $a
and read it backwards, it is not difficult to comprehend once squarely looked at, is not worth the overhead of reversing the whole array afterward, and is certainly not worth contorting your sort block to match the limitations of the policy analysis. Their decision not to change the default behavior to limit the policy to simple sort blocks is IMO incorrect. Your sort block is obviously beyond the scope of the written policy and is only triggered because Perl::Critic's policy implementation is limited.
Just because Perl::Critic has a policy on by default doesn't mean they represent good practice nor that they should be followed blindly. Feel free to configure it to your project's tastes, running Perl::Critic at its most picky levels requires it. In order to prevent silencing perlcritic from being a habitual thing, I would recommend preferring project-wide policy decisions in .perlcritic
to individually turning them off line by line.
Remember, the point is not to be perlcritic happy, the point is to write better code.