OVH Cloud OVH Cloud

syntaxe split

3 réponses
Avatar
Fox
Bonjour,

$ ls -lAF
-rw-r--r-- 1 Fox None 891 Apr 2 20:06 .bashrc
drwxr-xr-x 5 Fox None 0 Feb 12 17:25 .cpan/
-rw-r--r-- 1 Fox None 30390 Dec 28 23:20 .fonts.cache-1


la ligne suivante calcule la somme de la 5eme colonne (taille des
fichiers) :
$ ls -lAF | perl -e ’while (<>) { next if /^[dt]/; print +(split)[4],
"\n" } ’

OK, mais je ne comprends pas la syntaxe +(split)[4]
Sauriez-vous m'éclairer.

Merci
Bernard

3 réponses

Avatar
Benoit Izac
Bonjour,

le 13/04/2006 à 21:32, Fox a écrit dans le message
<443ea734$0$21278$ :

$ ls -lAF
-rw-r--r-- 1 Fox None 891 Apr 2 20:06 .bashrc
drwxr-xr-x 5 Fox None 0 Feb 12 17:25 .cpan/
-rw-r--r-- 1 Fox None 30390 Dec 28 23:20 .fonts.cache-1


la ligne suivante calcule la somme de la 5eme colonne (taille des
fichiers) :
$ ls -lAF | perl -e "while (<>) { next if /^[dt]/; print +(split)[4],
"n" } "

OK, mais je ne comprends pas la syntaxe +(split)[4]
Sauriez-vous m'éclairer.


Cette ligne ne calcule pas _la somme_. Elle se contente d'afficher le
champ contenant la taille de chaque fichier.

« split » sans argument opère sur $_ (qui est ta ligne en entrée) et
découpe chaque champ séparé par des espaces pour ranger le tout dans un
tableau. Si on prend la première ligne, split va renvoyer :
('-rw-r--r--', '1' ,'Fox', 'None, '891', 'Apr', '2', '20:06', '.bashrc')

« [4] » récupère le 5ème élément de ce tableau car la numérotation
commence à 0.

Pour le « + », perldoc -f print te l'expliquera mieux que moi ;)
Regarde aussi « Named Unary Operators » dans perlop.

print +(split)[4], "n"
équivaut à :
@tmp = split(/s+/, $_);
print($tmp[4] . "n");

PS : Tu devrais changer ton charset.
[Content-Type: text/plain; charset=windows-1252; format=flowed]

--
Benoit Izac

Avatar
Paul Gaborit
À (at) Thu, 13 Apr 2006 21:32:07 +0200,
Fox écrivait (wrote):
$ ls -lAF | perl -e 222 while (<>) { next if /^[dt]/; print +(split)[4],
"n" } 222

OK, mais je ne comprends pas la syntaxe +(split)[4]
Sauriez-vous m'éclairer.


Ça pourrait s'écrire de manière plus courte :

$ ls -lAF | perl -nle 'next if /^[dt]/; print +(split)[4]'

'-n' réalise automagiquement la boucle de lecture de l'entrée
standard.
'-l', entre autres, ajoute le passage à la ligne à chaque affichage.

Quant à l'instruction :

print +(split)[4]

Elle pourrait s'écrire de manière plus lisible :

print((split)[4]);

Le '+' est en fait une astuce syntaxique pour indiquer à Perl que la
liste (split) n'est pas la liste des arguments de 'print'.

Sans le '+', on aurait :

print (split)[4]

qui Perl interprète exactement comme :

print(split) [4]

qui est une erreur de syntaxe :

print (...) interpreted as function at -e line 1.
syntax error at -e line 1, near ") ["
Execution of -e aborted due to compilation errors.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Fox
Merci pour vos explications détaillées :o)