Il y a un présupposé ici, que le moyen le plus efficace pour faire beaucoup de "le tableau contient X?" contrôles est de convertir le tableau de hachage. L'efficacité dépend de la ressource rare, souvent le temps, mais parfois, et parfois programmeur effort. Vous avez au moins le doublement de la mémoire consommée en gardant une liste et un hachage de la liste autour simultanément. Plus vous écrivez, plus original le code que vous aurez besoin de tester, document, etc.
Comme une alternative, regarde la Liste::MoreUtils module, dont les fonctions any()
, none()
, true()
et false()
. Ils prennent tous un bloc comme le conditionnel et une liste en argument, semblable à de la map()
et grep()
:
print "At least one value undefined" if any { !defined($_) } @list;
J'ai couru un test rapide, le chargement dans la moitié de /usr/share/dict/words dans un tableau (25000 mots), puis la recherche de onze mots sélectionnés à travers le dictionnaire complet (tous les 5 000ème mot) dans le tableau, à l'aide de la matrice-à-méthode de hachage et l' any()
fonction de la Liste::MoreUtils.
Sur Perl 5.8.8 construit à partir de la source, le tableau de hachage méthode fonctionne presque 1100x plus rapide que l' any()
méthode (1300x plus vite sous Ubuntu 6.06 est emballé Perl 5.8.7.)
Ce n'est pas l'histoire complète cependant - le tableau de hachage de conversion prend environ 0,04 secondes qui, dans ce cas, tue le temps l'efficacité de la baie de méthode de hachage à 1,5 x 2x plus rapide que l' any()
méthode. Encore bonne, mais pas aussi stellaire.
Mon sentiment est que la matrice-à-méthode de hachage va battre any()
dans la plupart des cas, mais je me sentirais beaucoup mieux si j'avais un peu plus solide métriques (beaucoup de cas de test, décent analyses statistiques, peut-être que certains grands-O algorithmique analyse de chaque méthode, etc.) En fonction de vos besoins, de la Liste::MoreUtils peut être une meilleure solution; il est certainement plus souple et nécessite moins de codage. Rappelez-vous, l'optimisation prématurée est un péché... :)