Décortiquons.
J'ai déjà déclaré le hash %dirs :
Maintenant je ne veux réagir que si le nom du fichier est de la bonne forme :
comme je n'utilise pas =~, la regex m// est appliquée implicitement à $_ qui contient le nom du fichier (sans son chemin) dans la routine appelée par find().
Dans ce cas, j'ajoute (voir
push) le nom complet (avec chemin) du fichier dans une liste :
push(@{$dirs{$File::Find::dir}}, $File::Find::name)
Cette liste est "@{$dirs{$File::Find::dir}}" autrement dit, c'est la liste contenue dans le hash %dirs à l'indice $File::Find::dir, c'est-à-dire le chemin actuellement visité par find, sans le nom du fichier au bout. S'il n'y avait rien à cet indice, l'entrée est créée implicitement comme une référence de liste vide à laquelle on rajoute immédiatement un nom de fichier. S'il y avait déjà quelque chose, on rajoute un nom de fichier à la liste actuelle.
Au final, %dirs contiendra une entrée par répertoire contenant au moins un fichier de la bonne forme et ces entrées seront des références à des listes des fichiers de cette forme contenus dans le répertoire indice.
Lit
perlref pour plus d'explications sur les références en Perl (NB : la méthode de création ici est la méthode 6 listée dans perlref, et la méthode d'usage est la 2).
--
Jedaï
Partager