
Mardi, 15 mai 2012
Les unelignes* (oneliners) perl
Premièrement, l’option -e sur la ligne de commande est suivie d’une chaîne de perl à exécuter immédiatement. Selon l’OS, on préferera mettre le code entre simple ou double guillemets. Un exemple:
perl -e 'print qq/Hello world!\n/;'Notez l’usage de qq// au lieu de ” (simples guillemets). Étant donné que la chaîne de code est entourée de guillemets simples, ceci évite soit des problèmes avec le shell, soit d’échapper systématiquement les guillemets à l’intérieur du code. Si on utilise les guillemets doubles, attention au shell! Il risque d’interpréter les variables. Le point suivant est l’option -n. -n ouvre chaque fichier passé sur la ligne de commande et en passe chaque ligne au code perl (via $_). Voici un exemple:
perl -n -e 'print qq/$.:\t$_\n/;' textfile.txtl’exemple précédent parcourt chaque ligne du fichier ‘textfile.txt’ et affiche cette ligne précédée de son numéro de ligne ( c’est ce que contient la varibable spéciale $.). On peut considérer que l’option -n est équivalente à
while( <> ) { ........ }.Comme une grande partie des unelignes doivent afficher le contenu modifié des fichiers traités, nous pouvons économiser nos petits doigts grâce à l’option -p en lieu et place de -n. L’effet est le même, mais -p rajoute un print $_ implicite à chaque itération de la boucle. Quelque chose comme ça:
while ( <> ) { .......... # Votre code ici. print $_; }
Ceci est intéressant pour spécifier une action qui modifie $_ à chaque itération pour afficher le résultat modifié pour chaque ligne. Voici un exemple:
perl -p 's/\bperl\b/Perl/g;' textfile.txt
Ce code va parcourir “textfile.txt” et remplacer toutes les occurences de ‘perl’ par ‘Perl’. Le résultat est envoyé vers STDOUT, à moins que vous ne le redirigiez… Envoyons le vers un autre fichier:
perl -p 's/\bperl\b/Perl/g;' textfile.txt >temptext.txt
Facile, n’est ce pas? Maintenant, mieux. Souvent on voudrait simplement modifier le fichier “sur place”. L’option -i fait exactement cela. Avec l’option -i, on peut soit utiliser -i, ou préciser -i.bak pour indiquer à Perl de créer une copie de sauvegarde du fichier avant de le modifier. L’extension donnée sera ajoutée au nom dufichier; ‘.bak’, ‘.old’, ‘.proutprout’ ou ce que vous voudrez. Voilà comment utiliser l’édition en place:
perl -pi.bak -e 's/\bperl\b/Perl/g' infile.txt
Ce code va parcourir “textfile.txt” et remplacer toutes les occurences de ‘perl’ par ‘Perl’, puis va enregistrer le résultat dans le fichier. Une copie du fichier d’origine sera sauvegardée sous le nom ‘infile.txt.bak’.
Une autre option intéressante est -M. -M équivaut à use ….. par exemple “-MData::Dumper -e “print Dumper \%::” aura le même effet que d’utiliser
use Data::Dumper
dans le bloc de code.
Voilà, nous avons vu les options les plus courantes, on peut déjà en faire beaucoup! La prochaine fois, nous verrons quelques autres options utiles. Et aussi le “baiser eskimo”. Ah ah, je vois les petits curieux…
. * référence évidemment aux fameux “deulignes” de l’immensément regretté HHHHHHHHHebdo (que les moins de 20 ans ne peuvent pas connaître, les pôvres).
posté à: 12:22 permalink