[couverture de Linux Magazine 59]

Perles de Mongueurs (1)

Article publié dans Linux Magazine 59, mars 2004.

[+ del.icio.us] [+ Developers Zone] [+ Bookmarks.fr] [Digg this] [+ My Yahoo!]

Présentation

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

any2unix

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 :

(Jérôme Quelin - jquelin@mongueurs.net)

Effaceur de fichiers temporaires

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)

Conversion de secondes

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)

Le saviez-vous ?

Le nom de Perl

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)

Perl Power Tools

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)

À vous !

Envoyez vos perles à perles@mongueurs.net, elles seront peut-être publiées dans un prochain numéro de Linux Magazine.

[IE7, par Dean Edwards] [Validation du HTML] [Validation du CSS]