Comparaison d'un script simple en Perl, Python et Ruby
Par Juba le jeudi 24 août 2006, 01:03 - Linux, Debian, etc. - Lien permanent
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
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é.
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) }
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]
Ruby est de la m**** sans avenir,
Mettez vous à Python avant qu'il ne soit trop tard!
Docteur Zorg
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...
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 ?