Humus numericus

Aller au contenu | Aller au menu | Aller à la recherche

R, Spip et autres

Comparaison d'un script simple en Perl, Python et Ruby

Tiens, suite à une question d'un collègue de boulot aujourd'hui, je me suis amusé à comparer la manière de faire une tâche assez simple dans trois langages de script différents. L'objectif est d'afficher le chemin complet de tous les répertoires contenus (récursivement) dans un répertoire donné (en l'occurrence /var/log). Je trouve le résultat assez représentatif des particularités des différents langages :

En Python

import os
from os.path import join
for root, dirs, files in os.walk('/var/log'):
    for name in dirs:
        print join(root, name)

C'est pas forcément super intuitif (faut comprendre que la fonction os.walk renvoit un tuple avec le répertoire racine, les répertoires contenus et les fichiers contenus de chaque sous-répertoire parcouru. Mais c'est assez efficace.

En Perl

use File::Find;
find sub { print $File::Find::name, "
" if -d } , '/var/log';

Ah bah c'est sûr, difficile de faire plus bref. Mais c'est pas forcément évident du premier coup d'oeil, entre l'utilisation d'une référence à une fonction en argument de find, ou celui du test -d.

En Ruby

require 'find'
Find.find('/var/log') { |path| puts path if File.directory?(path) }

Et voilà. Simple, lisible, compact, compréhensible (du moins si on a compris le concept de bloc et d'itérateur). En un mot : é-lé-gant.

Bon, allez, je suis pas tout à fait objectif, je vous l'accorde...

Commentaires

1. Le jeudi 24 août 2006, 10:18 par Fred Bird

Moi qui ne pratique aucun de ces trois langages, j'ai tendance à préférer le python.

Mais je suis tout aussi subjectif, c'est probablement celui dont la syntaxe est la plus proche du PHP que je pratique, et j'avoue que je me suis déjà un peu penché dessus par curiosité.

2. Le jeudi 24 août 2006, 19:33 par Bruno Michel

Je suis tout à fait d'accord avec toi, Ruby est très élégant comme langage.

Sinon, c'est possible de faire un one-liner en Ruby :
Dir['/var/log/**'].each { |path| puts path if File.directory?(path) }

3. Le jeudi 30 août 2007, 15:16 par illthiriel

le code python montré ici n'est pas la forme la plus compact.

forme compact :

import os
print [os.path.join(root, name) for root, dirs, files in os.walk('/var/log') for name in dirs]

4. Le mardi 17 mars 2009, 13:21 par zorgi

Ruby est de la m**** sans avenir,
Mettez vous à Python avant qu'il ne soit trop tard!
Docteur Zorg

5. Le mardi 11 mai 2010, 10:17 par Jice

Tout à fait d'accord avec illthiriel.
Dans cette démonstration, Ruby est élégant mais si l'on utilise correctement python, il l'est tout à fait autant...

6. Le mercredi 28 décembre 2011, 12:41 par âmefeu

Hum ça fait envie d'apprendre le RoR...mais comment faire ? Quel ouvrage ou outil numérique recommandez-vous pour se former à ce langage dans le but de faire du web ?