Article publié dans Linux Magazine 59, mars 2004.
Depuis le numéro 41 de Linux Magazine, les Mongueurs de Perl vous proposent tous les mois de découvrir le langage Perl. Après une longue introduction au langage, vous avez pu lire dans ces pages des articles consacrés à des techniques de programmation, à des modules très utiles, aux options de Perl et j'en passe. Notre objectif avec ces articles est de vous faire découvrir des aspects de l'utilisation de Perl qui ne sont pas décrits habituellement dans les tutoriels sur le net ou dans les livres qu'on trouve en librairie.
Cette nouvelle rubrique courte viendra régulièrement compléter les articles Perl habituels. Nos perles seront des one-liners et autres scripts jetables que nous avons pu coder ou découvrir dans notre utilisation quotidienne de Perl, ainsi que des notules d'information plus ou moins utiles ou amusantes. Bref, des choses trop courtes pour en faire un article, mais suffisament intéressantes pour mériter d'être publiées.
Outre le jeu de mot, le titre de cette rubrique est également un hommage aux célèbres livres de Jon Bentley Programming Pearls (http://www.cs.bell-labs.com/cm/cs/pearls/) et More Programming Pearls.
Bonne lecture !
Philippe "BooK" Bruhat, Paris.pm - book@mongueurs.net
Vous avez récupéré un fichier texte depuis une partition DOS, et vous
voulez le lire depuis votre *nix favori. Mais malheureusement, Windows
et Unix n'encodent pas les fins de lignes de la même manière :
alors que Windows utilise la combinaison CRLF
(Carriage Return
ou \r
, suivi de Line Feed
ou \n
), Unix n'utilise que
Line Feed
.
Bien que les éditeurs évolués (vi, emacs, etc.) savent reconnaître ces formats, voici une commande vous permettant de vous affranchir de cette difficulté :
$ perl -pi -e 's/\r\n/\n/g' fichier_dos.txt
Attention, les Macs utilisent encore un schéma différent pour encoder
les fins de ligne : sur un Mac, les lignes se terminent par CR
seulement.
Voici donc mac2unix, qui a obtenu la deuxième place de la catégorie le programme le plus puissant de l'OPC-0 (Obfuscated Perl Contest, concours de Perl assombri), en 1996 :
$ perl -w015l12pi fichier_mac.txt
Petits tableaux récapitulatif :
Nom Oct Dec Hex C LF 012 10 0A '\n' CR 015 13 0D '\r'
La fin de ligne est indiquée au niveau système par \n
:
Système \n \r DOS/Windows CRLF(*) LF Unix LF CR Mac CR LF
(*) sauf si le mode de lecture/écriture binaire est activé sur
le descripteur de fichier correspondant (avec binmode()
).
(Jérôme Quelin - jquelin@mongueurs.net
)
Si vous utilisez un éditeur de texte, il peut arriver que celui-ci laisse des tas de fichiers temporaires de partout. Comment faire pour les effacer efficacement ?
Voici une commande qui va effacer tous les fichiers se terminant par un
tilde (~
), que nos amis emacsiens auront tout de suite reconnus :
$ find $HOME -name '*~' -print0 | perl -n0e unlink
À vous de l'adapter afin de supprimer les fichiers répondant à un motif donné...
(Jérôme Quelin)
Vous avez une durée exprimée en secondes, mais vous voudriez l'afficher en jours, heures, minutes, secondes.
Le one-liner qui tue :
$ perl -e '$s=shift;print join" ",map{$i=int($s/$_->[0]);$s-=$i*$_->[0];chop$_->[1]if$i==1;$i?($i,$_->[1]):()}[86400,"days"],[3600,"hours"],[60,"minutes"],[1,"seconds"]' 120983 1 day 9 hours 36 minutes 23 seconds
Code déplié et commenté:
$s = shift; print join " ", map { # concatène le résultat avec des espaces $i = int( $s / $_->[0] ); # combien de cette unité ? $s -= $i * $_->[0]; # secondes restantes chop $_->[1] if $i == 1; # supprime le 's' final au singulier $i ? ( $i, $_->[1] ) : () # retourne les éléments à afficher } # la liste des correspondances secondes/unité [ 86400, "jours" ], [ 3600, "heures" ], [ 60, "minutes" ], [ 1, "secondes" ]
Pour compter les mois et années, il suffit d'ajouter en début de liste
les valeurs de correspondance : [ 604800, "semaines" ]
,
[ 2628000, "mois" ]
et [ 31536000, "années" ]
. Attention au
singulier de mois !
J'ai utilisé ce code dans un script qui surveille ma ligne ADSL, afin de savoir combien de temps la ligne a été coupée. Lorsque la coupure est détectée, un fichier est créé dans /tmp/. Lorsque le réseau remonte, le script calcule l'âge du fichier, l'efface et enregistre l'information dans le fichier journal.
Pour calculer l'âge du fichier, il suffit de remplacer la ligne
$s = shift;
par $s = time - (stat shift)[9]
. Le fichier étant
passé en paramètre sur la ligne de commande (au lieu du nombre de
secondes comme dans l'exemple ci-dessus).
(BooK)
Perl a failli s'appeler GLORIA
, du nom de la femme de Larry
Wall. Mais, outre le fait que GLORIA
était trop long (6
caractères), Larry a voulu conserver la paix de son ménage, et a
préféré opter pour un nom plus neutre. :-)
Il a ensuite pensé à PEARL
, comme acronyme de
Practical Extraction and Report Language, mais un langage PEARL
existait déjà à l'époque. D'où le nom « Perl » que nous connaissons
aujourd'hui.
(Jérôme Quelin)
Les Perl Power Tools sont des scripts réimplantant en pur Perl toutes les commandes fondamentales d'Unix : pratique si vous ne disposez pas de ces commandes en standard ou si votre système ne vous propose que des versions que nous qualifierons charitablement de pas tout à fait fonctionnelles.
Vous trouverez plus d'informations ici : http://www.perl.com/language/ppt/.
(Jérôme Quelin)
Envoyez vos perles à perles@mongueurs.net
, elles seront peut-être
publiées dans un prochain numéro de Linux Magazine.
Copyright © Les Mongueurs de Perl, 2001-2011
pour le site.
Les auteurs conservent le copyright de leurs articles.