Cette question est un spin-off de cette une. Un peu d'histoire: lorsque j'ai appris Perl, j'ai toujours utilisé glob
plutôt que d' opendir
+ readdir
parce que je l'ai trouvé plus facile. Puis plus tard des postes divers et lectures suggérées qu' glob
a été mauvais, et maintenant j'ai à peu près toujours utiliser readdir
.
Après avoir réfléchi sur cette dernière question , j'ai réalisé que mes raisons pour l'un ou l'autre choix peuvent être superposés. Donc, je vais exposer le pour et le contre, et j'espère que les plus expérimentés Perl gens peuvent carillon et de clarifier. La question en un mot est il existe des raisons impérieuses de préférer glob
de readdir
ou readdir
de glob
(dans certains ou de tous les cas)?
glob
pros:
- Pas de fichiers de configuration utilisateur (sauf si vous demandez pour eux)
- L'ordre des éléments est garanti
- Pas besoin de préfixer le nom du répertoire sur les éléments manuellement
- Meilleur nom (allez -
glob
contrereaddir
est pas contesté si nous avons de la à en juger par le nom seul) -
(À partir de ysth réponse; cf.
glob
contre 4 ci-dessous) Peut retourner inexistante noms de fichiers:@pont = glob "{A,K,Q,J,10,9,8,7,6,5,4,3,2}{\x{2660},\x{2665},\x{2666},\x{2663}}";
glob
contre:
- Les anciennes versions sont tout simplement cassé (mais des "anciens" signifie avant 5.6, je crois, et franchement si vous êtes à l'aide de pré Perl 5.6, vous avez de plus gros problèmes)
-
Appels
stat
à chaque fois (c'est à dire, inutile d'utiliser desstat
dans la plupart des cas). - Des problèmes avec les espaces dans les noms de répertoire (est-ce toujours le cas?)
-
(À partir de brian de réponse) Peut retourner les noms de fichiers qui n'existent pas:
perl -le 'impression glob "{ab}{cd}"'
readdir
pros:
- (À partir de brian de réponse)
opendir
renvoie un descripteur de fichier que vous pouvez passer autour dans votre programme (et réutiliser), maisglob
retourne simplement une liste - (À partir de brian de réponse)
readdir
est un itérateur et propose des fonctions d'rewinddir
,seekdir
,telldir
- Plus vite? (Pure supposition basée sur certaines de
glob
'fonctions à partir de ci-dessus. Je ne suis pas vraiment inquiet à propos de ce niveau d'optimisation de toute façon, mais c'est théorique pro.) - Moins sujettes à bord de cas de bugs qu'
glob
? - Lit tout (dotfiles trop) par défaut (c'est aussi un con)
- Peut vous convaincre de ne pas le nom d'un fichier
0
(un con aussi - voir sa réponse) - N'importe qui? Bueller? Bueller?
readdir
contre:
- Si vous ne vous souvenez pas d'ajouter le nom de répertoire, vous permettra d' obtenir des bits lorsque vous essayez de faire filetests ou copier des éléments ou modifier des éléments ou...
- Si vous ne vous souvenez pas d'
grep
le.
et..
articles, vous permettra d' obtenir peu, quand on compte les éléments, ou d'essayer de marcher de façon récursive en bas de l'arborescence de fichiers ou de... - Ai-je mentionné les préfixant le nom du répertoire? (Une note, mais mon tout premier post du Perl Débutants de la liste de courrier était le classique, "Pourquoi est-ce code impliquant filetests fonctionne pas de temps en temps?" problème lié à cette chasse aux sorcières. Apparemment, je suis toujours amer.)
- Les articles sont retournés dans aucun ordre particulier. Cela signifie que vous devrez souvent n'oubliez pas de les trier, d'une certaine manière. (Ce pourrait être un pro si cela signifie plus de vitesse, et si cela signifie que vous fait réfléchir sur la façon et si vous avez besoin de trier les éléments.) Edit: Terrifiant petit échantillon, mais sur un Mac,
readdir
renvoie les éléments dans l'ordre alphabétique, insensible à la casse. Sur un système Debian et OpenBSD serveur, la commande est tout à fait aléatoire. J'ai testé le Mac avec Apple en Perl (5.8.8) et mon propre compilé 5.10.1. Le système Debian est 5.10.0, comme c'est la machine OpenBSD. Je me demande si c'est un problème de système de fichiers, plutôt que de Perl? - Lit tout (dotfiles trop) par défaut (c'est aussi un pro)
- N'est pas forcément bien avec un fichier nommé
0
(voir les pros - voir sa réponse)