• # Perl

    Posté par . En réponse au journal Haskell et le tri. Évalué à 4. Dernière modification le 25 février 2016 à 10:56.

    >>> l = [("Bruce Lee", 50), ("Batman", 100), ("Hulk", 200), ("La montagne", 100)]
    >>> def compare(t0, t1):
    ... c = cmp(t1[1], t0[1])
    ... if c == 0:
    ... return cmp(t0[0], t1[0])
    ... else:
    ... return c
    ... 
    >>> sorted(l, cmp=compare)
    [('Hulk', 200), ('Batman', 100), ('La montagne', 100), ('Bruce Lee', 50)]
    

    L’équivalent en Perl :

    use Data::Dump;
    my @liste = (["Bruce Lee", 50], ["Batman", 100], ["Hulk", 200], ["La montagne", 100]);
    my @triee = sort { $b->[1] <=> $a->[1]
     || $a->[0] cmp $b->[0] } @liste;
    dd(@triee);

    et le résultat, affiché par dd :

    (
     ["Hulk", 200],
     ["Batman", 100],
     ["La montagne", 100],
     ["Bruce Lee", 50],
    )

    sort accepte en argument un bloc de code effectuant la comparaison, $a et $b correspondant aux éléments à comparer.

    <=> et cmp sont les opérateurs de comparaison, respectivement numérique et lexicale ; ils rendent -1, 0 ou 1 selon le résultat de la comparaison.

    Du point de vue des opérations booléennes, 0 est considéré comme faux et les autres nombres comme vrai. Par ailleurs, les opérateurs booléens (sauf !, not) rendent la valeur d’origine (et n’évaluent que leur premier argument s’il suffit à déterminer que le résultat est vrai ou faux).

    Par conséquent || (ou) rend la valeur de la première comparaison si elle est non nulle et de la seconde sinon.

    Grâce à cela, faire un tri personnalisé est simple ; ça respecte le principe de Larry Wall : « Easy things should be easy and hard things should be possible ».

    « Le fascisme c’est la gangrène, à Washington comme en Russie. » — adapté de Renaud, Hexagone