2012-02-22 10 views
2

Perlでは、私が行うことができます。

つのフィールド(配列要素)下降し、他の(ハッシュキー)昇順で並べ替えられますが、文句を perlcriticを引き起こし
my @unit_indices = sort { 
    $units{$b}[0] <=> $units{$a}[0] 
     or 
    $a cmp $b 
} keys %units; 

禁じます$ bを行X、列Yのソートブロックの$ aの前。PBPの152ページを参照してください。 (重要度:1)

Perlのベストプラクティスではなくreverseを使用することをお勧めします。

しかし、あなたが書いた場合の動作は、はるかに分かりのようになります。
@sorted_results =逆ソート@unsorted_resultsを。

しかし、逆方向に実行されるサブゾットを持つ方法は見つかりませんでした。

明らかに、私はperlcriticにこれを無視するように言うことができますが、私は必要なものを達成する方法を知りたいと思います。perlcritic

+1

なぜ世界であなたは貧弱な 'perlcritic'を使用しますか?それは信じられないほどstooopeeedです。それがあなたの最初の間違いです。第二に、あなたはPBPのアドバイスを混乱させました。最初のソート機能はうまくいきますが、読みやすさを向上させるために '||'の代わりに 'または'を避けることを除いてはもちろんです。あなたの質問は、あなたが既にそれを行う正しい方法をはっきりと知っているので、間違っています。 – tchrist

+0

コードは正常です。 perlcritic - $ aと$ bのバグのような音は、ソートのための有効なperl変数です。 $ aと$ bがそのスコープのソートブロックとループ内のブロックの外側に存在する場合にのみ警告する必要があります。複数のキーのソートが検出されないようです。 – Rich

+1

同様の問題が報告されています。https://rt.cpan.org/Public/Bug/Display.html?id=36129 – toolic

答えて

4

は私がtchristさんのコメントに同意するが、額面であなたの質問を取る:

1)## no critic

my @unit_indices = sort { ## no critic (ReverseSortBlock) 
    $units{$b}[0] <=> $units{$a}[0] 
     or 
    $a cmp $b 
} keys %units; 

2).perlcriticrcファイル

[-BuiltinFunctions::ProhibitReverseSortBlock] 
を使用して使用します)を変更しますあなたの比較感覚

my @unit_indices = sort { 
    -($units{$a}[0] <=> $units{$b}[0]) 
     or 
    $a cmp $b 
} keys %units; 

my @unit_indices = sort { 
    -$units{$a}[0] <=> -$units{$b}[0]) 
     or 
    $a cmp $b 
} keys %units; 
+5

Ick。 3をしないでください。それは、ロボットではない実際の人々のためにあなたのコードを理解しにくくするだけです。 – cjm

+0

@cjm - 私はロボットだということですか? :) – DVK

+1

Perl 5.16では '> = <'演算子が必要です! – mob

9

Perl ::批評家は良いポリシーを提示するよりもPBPを正確に再現することに重点を置いており、Perlベストプラクティスはうまく老化していません。たとえば、悲惨なことに今のところMiscellanea::RequireRcsKeywordsがデフォルトでオンになっています。

Perl :: Critic'sポリシーは、標準として扱われるべきではありません。 「修正」が実際に複雑さを増やすかどうかを判断する主観的な分析を行う能力が欠けています。特に、重大度が低下し、利益が狭く狭くなった場合などです。 BuiltinFunctions::ProhibitReverseSortBlockは「美容的」レベルのポリシーであり、このカテゴリに完全に該当します。

誰かが$b cmp $aをスキップして後方に読むかもしれませんが、それを理解するのは難しいことではありません。その後、全体の配列を逆にするオーバーヘッドにはならず、制限に合うように政策分析のポリシーを単純なソートブロックに制限するためにデフォルトの動作を変更しないとの決定は、IMOが間違っています。あなたのソートブロックは書かれた方針の範囲をはるかに越えており、Perl :: Criticの方針の実装は限られているので、トリガされるだけです。

デフォルトでPerl :: Criticにポリシーが設定されているということは、それが善行を表しているとは限らず、盲目的に従うべきことを意味するものでもありません。プロジェクトの好みに合わせて自由に設定してください。Perl :: Criticを実行するには、最も厄介なレベルで実行する必要があります。サイレント犯罪を防ぐために、プロジェクト全体の政策決定を.perlcriticで行ごとに個別にオフにすることを推奨します。

覚えている点は、幸せになることではなく、ポイントはより良いコードを書くことです。

+1

+1と競合しています。同意する。私が明らかにすべきであった私の質問のポイントは、その選択肢が何であるか知りたかったので、警告を選択的に無視するという情報に基づいた決定を下すことができたということでした。 –

+1

Well⁠⁠said.⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠ – tchrist

2

perlcriticを自由に使用できますが、それに従わないでください。 perlcriticの要点は、間違っている可能性の高い警告を発行する能力を持つことです。

確かにをsort { $b <=> $a }以上にすることを奨励しようとしていますが、ここではできません。

誤った警告を止めるためにコードを悪化させないでください。場合によっては、警告が間違っていることがあります。この場合、警告に対処する必要があります。

+0

あなたは 'perlcritic'を使っていますか?私はむしろそれを学ぶことに驚くだろう。 – tchrist

+0

@ tchrist、私は "Perlcriticを使う"の代わりに "Perlcriticを自由に使うこと"を意味すると思います。 (固定)私は職場で(主に同僚のために)プロファイルを作成しようとしましたが、それは時間の無駄だったように感じ始めました。あまりにも多くの悪いコール。私は、コードを崩壊させて誰かを黙らせようとしている人を想像することはできません。 – ikegami

+3

私はperlcriticの考えが価値があると思う。それは私の肩を見て、私を正直に保ちます。長年にわたり、私はそれを私の意志に形作り、私の理論的根拠を述べました。それは始めるより良い場所かもしれません。 https:// github。com/schwern/test-more/blob/Test-Builder1.5/.perlcriticrc – Schwern

関連する問題