python et perl: comparer ce qui est comparable ...

voici un petit comparatif qu'un sympatique collègue a bien voulu me transmettre ou le script python

import sys, os, string
for name in os.listdir('/proc'):
   path = os.path.join(os.path.join('/proc', name), 'status')
   if os.path.isfile(path):
      fp = open(path, 'r')
      st = fp.read()
      fp.close()
      print string.split(st)[0]

est réécrit en perl

perl -wle '
    open F, "$_/status"
        and print +(split/\s+/,<F>)[0]
        for </proc/*>
'

A mon tour d'essayer: le code perl utilise (mal?) les globs. En les utilisant mieux:

for (</proc/*/status>)) {
    open F,$_
        and map { print +(split/:/)[0] } <F>
}

sans être balèze en python, je peux réécrire un code analogue:

import glob
for f in glob.glob('/proc/*/status'):
    for l in open(f).readlines():
        print l.split(':')[0]

en ruby

Dir.glob('/proc/*/status').each { |d|
  open(d).readlines.each { |l| puts l.split(':')[0] }
}

et perl6, ca devrait donner:
for '/proc/*/status'.glob  { for =$_ { print .split(':')[0] } }

toutefois, pour un problème aussi simple, je n'aurais peut-etre pas utilisé
autre chose que mon interpréteur deja lancé: en zsh:

cut -d: -f1 /proc/*/status

ou, si il peut y avoir beaucoup de processus:

autoload -U zargs # si ca n'est pas deja fait
zargs /proc/*/status -- cut -d: -f1

Une remarque cependant: le fait est que pour perl, l'utilisation des globs peut
provoquer l'ouverture de subshells dans certains cas (je n'ai aucun exemple et
ca n'est pas vrai pour l'exemple étudié).

Si ces cas se présentent, ils posent les problèmes suivants:
- pas tres efficace
- pas tres portable
- deconseillé pour des raisons de securité

Quid des autres langages?

En tout cas, voilà ce que j'aurais finalement écris en perl

use strict;
use warnings;
use IO::All;
 
$\=$/; # equivalent to perl -l flag
 
for my $proc ( io(q</proc>)->all_dirs ) {
    $_ = "$proc/status";
    -r and map {
        print +(split/:/)[0]
    } io($_)->slurp
}

Ce que tu aurai écrit, est la

Ce que tu aurai écrit, est la solution la moins lisible parmis toutes celles proposées ...

Vu la taille des disques durs, je serai pour quelques lignes supplémentaires et un code LISIBLE :)

Poster un nouveau commentaire

Le contenu de ce champ ne sera pas montré publiquement.
  • You can use BBCode tags in the text.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. Beside the tag style "<foo>" it is also possible to use "[foo]".

Plus d'informations sur les options de formatage