$ 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 action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
Bonjour,
le 13/04/2006 à 21:32, Fox a écrit dans le message
<443ea734$0$21278$8fcfb975@news.wanadoo.fr> :
$ 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]
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
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/>
À (at) Thu, 13 Apr 2006 21:32:07 +0200,
Fox <foxbernard@hotmail.com> é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/>