Quelles sont les raisons de préférer glob sur readdir (ou vice-versa) en Perl?

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 opendir + readdir parce que je l'ai trouvé plus facile. Puis, plus tard divers postes et des lectures suggéré que glob était mauvais, et maintenant j'ai à peu près toujours utiliser readdir.

Après réflexion 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 à readdir ou readdir à glob (dans l'un ou dans tous les cas)?

glob pour:

  1. Pas de fichiers de configuration utilisateur (sauf si vous demandez pour eux)
  2. Ordre des éléments est garanti
  3. Pas besoin de préfixer le nom du répertoire sur les éléments manuellement
  4. Meilleur nom (allez - glob contre readdir est pas un concours, si nous sommes en juger par les noms seuls)
  5. (À partir de ysth réponse; cf. glob contre 4 ci-dessous) Peut retourner inexistante noms de fichiers:

    @deck = glob "{A,K,Q,J,10,9,8,7,6,5,4,3,2}{\x{2660},\x{2665},\x{2666},\x{2663}}";

glob inconvénients:

  1. 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 plus de problèmes)
  2. Appels stat à chaque fois (c'est à dire, inutile d'utiliser des stat dans la plupart des cas).
  3. Des problèmes avec les espaces dans les noms de répertoire (est-ce toujours le cas?)
  4. (De brian réponse) Peut retourner les noms de fichiers qui n'existent pas:

    $ perl -le 'print glob "{ab}{cd}"'

readdir pour:

  1. (De brian réponse) opendir renvoie un descripteur de fichier que vous pouvez passer autour dans votre programme (et réutiliser), mais glob retourne simplement une liste
  2. (De brian réponse) readdir est un itérateur et fournit des fonctions de rewinddir, seekdir, telldir
  3. Plus vite? (Pure supposition basée sur certaines glob's caractéristiques à 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.)
  4. Moins sujettes à bord de cas de bugs que glob?
  5. Lit tout (dotfiles trop) par défaut (c'est aussi un con)
  6. Peut vous convaincre de ne pas le nom d'un fichier 0 (un con aussi - voir sa réponse)
  7. Quelqu'un? Bueller? Bueller?

readdir inconvénients:

  1. Si vous ne vous souvenez pas d'ajouter le nom de répertoire, vous sera obtenir bits lorsque vous essayez de faire filetests ou copier des éléments ou modifier des éléments ou...
  2. Si vous ne vous souvenez pas de grep la . et .. éléments, vous sera obtenir bits lorsque vous comptez les éléments, ou d'essayer de marcher de façon récursive en bas de l'arborescence de fichiers ou de...
  3. 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.)
  4. 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 avez réellement pense sur la façon et si vous avez besoin de trier les éléments.) Modifier: 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?
  5. Lit tout (dotfiles trop) par défaut (c'est aussi un pro)
  6. N'est pas forcément bien avec un fichier nommé 0 (voir les pros - voir sa réponse)
  • Sur mon Mac avec Perl 5.10.1, j'ai été en mesure de créer un répertoire avec un espace et glob retourné comme faisant partie de sa liste. J'ai même fait un nom de répertoire avec un saut de ligne dans et cela a fonctionné. 🙂