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