Perl vs Shell vs Python
Par Nicolas Steinmetz. mercredi 16 décembre 2009, 23:00. Trucs de geek bash perl python shell | Lien permanent.
Ayant suivi il y a 2 semaines une formation Perl de 3 jours vu qu'il s'agit d'un standard de fait chez JCDecaux pour tout ce qui touche au scripting, mon petit ressenti sur le sujet.
Tout d'abord, il faut dire que j'allais à cette formation avec un a priori plutôt négatif sur Perl de part ce que j'avais pu en entendre ici ou là. Il faut dire que j'ai plutôt été agréablement surpris par certains cotés.
Match perl vs bash :
- Perl peut être vue comme une bonne alternative / un bon complément à des scripts bash. Plutôt que de vous casser la tête à apprendre à utiliser grep/sed/awk, vous pouvez faire la même chose mais uniquement en perl. Parce que bon, franchement awk, c'est peut être super puissant mais je trouve ça inabordable et loin d'être évident.
- Je compte ainsi revoir certains scripts bash qui ne me satisfont pas pour voir si Perl ne me permettrait pas d'atteindre l'objectif souhaité.
Match perl vs python : avantage Python
- Pour le coup, le langage avec des des
$,%, et même@ devant les types de données, des accolades pour les débuts/fin de bloc qu'on ne sait jamais à quel niveau positionner pour rester lisible de bout en bout et des;en fin de ligne, j'ai du mal. Surtout maintenant que je me suis habitué à la syntaxe python que je trouve infiniment plus lisible et moins source d'erreur. - Dans la même veine, les syntaxes sont pas des plus évidentes : ainsi dire que
$tabest un scalaire,@tabun tableau,%tabun tableau associatif et que si on met un "antislash" devant on parle alors d'une référence vers le scalaire/tableau/tableau associatif, ça aide pas l'écriture d'un script
Par ex en perl :
if ( $toto == 2) { print "Toto vaut : $toto\n"; }
et en python :
if toto == 2: print "Toto vaut %s" % toto
- Perl fonctionne de façon beaucoup trop implicite/facultative contrairement à python. Python impose un certain nombre de conventions et c'est bien. Le "There is more than one way to do it" de Perl peut être séduisant mais aussi contre productif, surtout en entreprise.
Exemple pour parcourir un tableau en perl :
#! /usr/bin/perl -w # Tableau simple @tab = ("fraise", "abricot", "goyave", "pamplemousse"); foreach (@tab) { print "Valeur : $_ \n"; } # Tableau associatif %hash = ("France" => "Paris", "Allemagne" => "Berlin", "Angleterre" => "Londres"); foreach (keys %hash) { print "Pays : $_ , Capitale: $hash{$_}\n"; }
Le $_ est appelé scalaire par défaut. Il est conseillé de vivement l'utilisé plutôt que d'initialiser une variable. De prime abord, ça surprend. Il existe aussi un @_ dans les fonctions et qui correspond à un tableau d'arguments passés à la fonction.
Dans ce cas les parenthèses sont implicites. On peut bien sur écrire :
foreach(keys(%hash))
alors qu'en python :
tab = ["fraise", "abricot", "goyave", "pamplemousse"] for fruit in tab: print "Valeur : %s" % fruit hash = {'France' : 'Paris', 'Allemagne': 'Berlin', 'Angleterre' : 'Londres'}; for key, value in hash.items(): print "Clé : %s Valeur %s" % (key, value)
Dans les deux cas, nous aurons :
Valeur : fraise Valeur : abricot Valeur : goyave Valeur : pamplemousse Pays : France , Capitale: Paris Pays : Angleterre , Capitale: Londres Pays : Allemagne , Capitale: Berlin
Si on rajoutait un tri en perl, en implicite cela peut aller jusqu'à :
foreach (sort keys %tab) { }
Difficile de s'y retrouver à mon humble avis.
- Perl n'a pas de "prompt" intégré : Franchement pouvoir taper "python" dans un shell et ensuite codé en direct son script et le retoucher, que de temps gagné. Il y a certes
perl -pe "commandes perl"mais c'est bien en deçà de ce que peut offrir python. - Mettre
/usr/bin/perl -wen début de script permet de lever les warnings et corriger les éventuels bugs - Python propose le module "re" pour les expressions régulières. Pas besoin donc de se mettre spécifiquement à Perl s'il y a des besoins de RegExp

- J'ai l'impression que la doc python est de meilleure qualité même si apparemment Perl rattrape petit à petit son chemin...
- Globalement, Python et Perl doivent permettre de faire les mêmes choses, donc je vais considérer le périmètre des langages comme ex-aequo.
- Même si cela m'a troublé de prime abord avec les listes en python, les listes en perl sont sympathiques :
@tab = ("un", "deux", "trois"); ($t1, $t2, $t3) = @tab; print "t1 vaut $t1\n"; print "t2 vaut $t2\n"; print "t3 vaut $t3\n";
Contrairement à ce que l'on pourrait croire de prime abord, cela n'est pas un tableau mais juste un "panier" de variables. On peut donc utiliser $t1 & co.
- La notation objet est plus claire en Python. Je n'adhère toujours pas au
$titi->dosomething();(comme en PHP en fait) - La prise en main de python est beaucoup plus immédiate (aux listes / tuples (grosso modo des listes non modifiables) / dictionnaires (tableaux associatifs) prêt
)
- D'ailleurs, les listes en python correspondent aux tableaux en perl et les dictionnaires python au hash (tableau associatif) perl.
- Sauf erreur, il n'y a pas d'équivalent des tuples en perl
- Les listes en perl n'ont donc rien à avoir avec les listes en python (cela m'a pas mal dérangé durant la formation)
Ce qui fait qu'au final, je rejoins tout à fait David sur "Pourquoi Python & Django". A titre personnel, mon langage de prédilection va donc rester python et je vais voir dans quelle mesure je peux encourager python au boulot. J'y ai déjà glissé une appli Django après tout 
Perl a malgré tout été une bonne surprise, je m'attendais à pire. Il convient par contre dans un contexte d'entreprise je pense de rendre le code le plus verbeux possible pour facilité sa reprise et sa maintenance.
Commentaires
Perl m'a jamais attiré et c'est pas ce billet qui risque de changer la donne
C'est clair que ça ne donne pas envie d'apprendre Perl. Encore plus quand les exemples montrés génèrent des erreurs et ne sont même pas exécutés par l'interprèteur (un indice : keys() s'utilise avec un hash, pas une liste. Voir `perldoc -f keys`).
Qui blâmer ici? La qualité douteuse d'une formation qui n'apprend pas à ses étudiants à écrire du code correct? Ou l'étudiant qui n'est pas capable de retenir ce qui semble être le B.A-BA du langage?
Dans tous les cas, je trouve assez "audacieux" de tenter d'écrire un comparatif entre plusieurs langages après une simple formation de 3 jours pour l'un d'eux quand on ne maitrise ni les concepts, ni les possibilités offertes et encore moins, clairement, la syntaxe.
Je ne puis que vous conseiller de lire les articles intitulés "From Novice to Adept" sur http://www.modernperlbooks.com/mt/ (le premier datant du 12 Octobre) pour une discussion sur comment aborder Perl.
Cordialement,
après 20 d'administration unix / dev système
)
J'ai commencé par le shell/awk/grep/sed
Puis j'ai fait du perl, beaucoup de petites choses et quelques grosses (dont un serveur TCP pour du suivi de fab)
Puis j'ai découvert python la aussi quelques petites choses, et quelques plus grosses.
En conclusion :
Shell est irremplacable pour sa disponibilité et pour sa conso mémoire / cpu très faible (même si maintenant tout le monde s'en fout ...
Perl permet de faire des choses très vite, et parfois très mal mais c'est aussi un besoin
il permet aussi de convertir du shell et de l'awk en perl, il est dispo en standard sur plus
d'unix que python (même si cela devient de moins en moins vrai)
Python OBLIGE une certaine structure donc c'est plus long de faire des choses simples mais
elles restent plus facile a lire 6 mois après
par contre perl mais appris énormément de choses ont est très proche de l'os (moins que shell mais plus que python)
Mais je ne ferais plus de gros dev en perl
Python est tout aussi robuste mais beaucoup plus simple a se remettre dans des scripts de 3000 lignes des mois après (c'est pas de faire du dev faut aussi maintenir ...)
Perl du moment ou l'on touche des objets avec des tableaux oub des reférences devient assez illisible, mais peut être n'ais-je pas pris la bonne route ?
les intégristes diront que l'on peut faire du code lisibles en perl et de l'obscur en python
et c'est vrai
par contre, pour l'avoir repratiquer dernièrement quelqu'un connaît les équivalents perl du prompt python (>>>) ? cela m'a manqué de pouvoir tester en live certaines fonctions .
Sinon il faut reconnaitre que avec ces 2 langages + ruby on est quand même heureux non
?
Moi, c'est le contraire...
je ne supporte pas la syntaxe de Python
@Geraud :
- Oups, en effet -
- Merci pour le lien, cela me sera utile à l'avenir

- Ce n'est pas tant une comparaison que mon ressenti comme indiquer en début de billet.
Grace à David (via Twitter), j'ai aussi gagné la fonction enumerate()je corrige ça ce soirC'est corrigé. Mea culpa. Je ne cherche pas à comparer les langages pour les comparer, c'est mon ressenti comme indiquer au début du billet suite à cette formation de 3 jours.Me coucherai nettement moins bête ce soir tiens...
Oh le but n'était pas de dénigrer l'un et pour encenser l'autre
)
ni de lacher un gros troll bien poilu (je prefere vi contre emacs
mais d'en degager une discussion constructive qui me permet de connaitre un peu mieux les 2 langages.
Surtout que dans le cas de perl et de python, la rencontre de Larry et de Guido a plus que fait avancer les 2 langages
TIMTOWTDI
my @tab = qw(fraise abricot goyave pamplemousse); for my $fruit (@tab) { say "Valeur : $fruit"; } # or say "Valeur : $_" for @tab; my %hash = ( France => "Paris", Allemagne => "Berlin", Angleterre => "Londres" ); while (my ($key, $value) = each %hash) { print "Pays : $key , Capitale: $value\n"; }Ca c'est du perl comme on aime !
mais quand on a des choses comme :
$l .= sprintf( "%-5.5s " , $POSTE_CHARGE{$rs->{Z_XWSTCB}$nb} );
en python
l += "%-5.5s" % POSTE_CHARGErs.Z_XWSTCB[nb]
(sauf erreur ou omission
)
honnetement ca fait moins de caracteres a taper
A+
chris
Arg j'ai été censuré ! je me permet de le republier
Ca c'est du perl comme on aime !
clair net et concis on dirait du python !
mais quand on a des choses comme :
$l .= sprintf( "%-5.5s " , $POSTE_CHARGE{$rs->{Z_XWSTCB}$nb} );en python
(sauf erreur ou omission
)
honnetement ca fait moins de caracteres a taper
vous avez la permission de critiquer même injustement c'est du code à moi que j'assume
A+
chris
@chris :
La syntaxe wiki de dotclear dans les commentaires a parfois quelques effets de bords
Je reviens sur ton premier commentaire ce soir mais je suis assez d'accord avec toi
Il y a aussi
en python:
if toto == 2:
c'est trop long
en Perl:
$toto == 2 && print "Toto vaut $toto\n";
on a l'avantage d'avoir une chaine lisible directement sans tant de %s, qui peuvent tres vite devenir nombreux, et vite ingerables.
Voila pour mes 2 cents. Quand on prefere un langage a un autre, difficile de faire un article reelement subjectif.
Aaah je me disais bien aussi qu'un adepte de perl allait répondre
J'aime aussi ce genre de syntaxe et perl et très fort dans cette partie
mais parfois j'ai du mal a relire, ou mes collègues qui ne connaissent pas le
perl ne comprennent pas et rejettent avec un air de dégout
par contre j'ai testé avec du python et cela passe mieux ...
En gros, pour un même scripts je peu :
soit passer pour un geek nolife avec du perl
soit être considéré comme un être humain avec du python
personne pour défendre ruby dommage ...
j'aime bien la syntaxe
5.times do print "Hello" endEt pour répondre a tfe
quand on compare des langages a d'autres difficile d'être objectif sauf sur des cas
précis comme la perf ou des notions globales
Le coding (codage ?) c'est comme la peinture ou la musique
laissons à l'artiste le choix des instruments
ce qui compte c'est le vote du public
A+
@chris :
Tout langage peut être utilisé de façon ignoble. Mais en forçant une structure et des conventions, je pense que python permet d'être plus accessible à un débutant et de le rendre de fait plus maintenable sur la durée (le néophyte empruntant rarement les écritures raccourcies).
C'est sur que Shell est "au plus proche de l'os" et a son immédiateté comme incontestable avantage. Perl ou Python, en rajoutant une couche perdent forcément sur ce terrain là mais te donne comme tu le dis aussi plus de choses par ailleurs. Pour des scripts un peu évolués, on voit donc tout de suite leur intérêt puisqu'ils permettent d'accéder à pleins de choses différentes qu'un shell ne permet pas ou du moins sauf à embarquer toutes les commandes disponibles.
Sur ruby, joker, j'avoue ne pas adhérer à sa syntaxe - moins lisible par défaut je trouve que celle de python.
@tfe : effectivement, j'ai une préférence pour python, je ne vais pas le cacher - on peut lui reprocher son manque de concision (surtout si on est habitué à perl je pense) mais ne même temps, je trouve que c'est une de des forces : c'est explicite et le temps de réimmersion dans le code est assez faible je trouve.
Python a aussi ses notations raccourcies pour les boucles while & co mais jusqu'à présent, je les ai plutôt éviter au profit de la lisibilité du code. Je préfère perdre une ligne mais un code ultra lisible que de faire des économies de bout de chandelles
Sinon je pense que tu voulais dire "difficile de faire un article réellement objectif"
@chris : l'exemple que tu donnes est par ex une des raisons qui ne me font pas aimer ruby
Comme quoi un dev = une manière de penser et donc une méthode une approche différente !
c'est sur python est un excellent langage généraliste que l'on peut recommander
à tous y compris au débutant. un remplacant du basic ?
C'est moins vrai pour perl et nettement moins pour le shell
il serait intéressant de voir par quel langage vous avez commencé, je suis sur que cela
influence la manière de voir les choses.
Pour moi le basic du ZX81 et ses 1Ko de RAM (sauvegarde sur cassette audio :))
Le c reste pour moi qu'un assembleur amélioré (très puissant mais ..) porté sur
plein de machines.
Enfin, merci pour cet echange riche en reflexion et en courtoisie, du web comme on aime
passez de très bonnes fêtes et Joyeux Noël
A+
chris
Merci pour cette discussion fort passionnante
joyeuses Fêtes à tous !
@chris : pour ma part, j'ai commencé par HTML/CSS > PHP > Shell > Python > Perl. Sachant que pour Shell, c'est plutôt un apprentissage par les usages qu'autre chose (pas lu de bouquin sur le sujet ou suivi de formation comme pour les autres langages en fait). Sinon avant ça, un peu de basic & scripts batchs sous DOS sur mon PC x286 et ensuite du Basic/Pascal sur calculette Casio/Texas Instrument. Mais on va dire que ça compte pas
Bonnes fêtes de fin d'année également et désolé que ton commentaire soit passé dans l'antispam...
J'ai travaille dans 2 boites de devellopement web ou ils ont fini par porter tout leur scripts Perl en PHP.
Et etrangement on s'est meme rendu compte que cela fonctionnait mieux (plus vite) dans ce dernier langage.
Ayant aussi du faire la maintenance de scripts perls ecrit par d'autres personnes avant moi, je dois avouer
que j'ai eu tres tres dur a apprecier ce langage qui pour moi est vraiment un langage write only.
Voila, maintenant pour tout vous avouer, je ne trouve pas AWK compliquer, que du contraire et quand je dois
ecrire un script de plus de 2 ecrans j'utilise Python. Meme des programmeurs PHP ou SHELL qui ne connaissent pas le python arrivent facilement a comprendre ce que j'ai ecris. (La ou parfois des programmeurs perl souffrent pour comprendre d'anciens codes perl ...) .
Voila tout cela pour dire que le choix d'un langage ne se fait pas que sur ses merites pur mais aussi
et surtout sur des notions pratique. (tout le monde connait PHP alors on utilise PHP, Python est plus lisible et maintenable ...).