donné quelque chose comme est garanti pour itérer sur les touches dans un ordre cohérent si le hachage n'est pas altéré? P> P>
3 Réponses :
Oui . De touches perdoc -f code>
: p>
Les touches sont renvoyées dans un ordre apparemment aléatoire. L'ordre aléatoire réel est sujet à changement dans les versions futures de Perl, mais
il est garanti d'être le même ordre que les valeurs code> ou ou
chaque fonction code> produit (donné que le hash n'a pas été modifié) strong>. Depuis Perl 5.8.1, la commande est différente, même entre différentes pistes de Perl pour des raisons de sécurité (voir "Attaques de complexité algorithmique" dans
perdoc perlsec code>
). P> blockQuote>(mettre l'accent sur le mien) p>
+1 Ce serait génial si les gens ont du moins tenté de lire l'excellente documentation avec Perl.
C'est une attente assez gentiment. C'est probablement, mais pourquoi inquiétez-vous? Fetch Tchys à l'avance, enregistrez le résultat, puis itérer sur le résultat enregistré. Ensuite, vous êtes garanti d'accéder aux clés dans le même ordre. Travailler sur les bords des détails de la mise en œuvre non spécifiés est dangereux. P>
Edit: a raté la "garantie" dans le doc, mais je pense toujours qu'il est dangereux de s'attendre à ce que cela ne change jamais. Surtout quand il y a des moyens d'obtenir les mêmes objectifs. P>
Pourquoi les citations d'effrayage autour de "garantie"? C'est (a) très clairement indiqué; (b) il est peu probable de changer, car il est important de code> clés code> et code> pour revenir dans le même ordre, de sorte que les deux puissent être corrélés pour quand vous ne pouvez pas utiliser < code> chacun code>.
edit: strong> Bien qu'un hachage normal ait une commande cohérente, dans le cas d'un hachage attaché L'ordre des clés est pas bien défini em> strong>, car il est contrôlé par l'utilisateur! P> Bien que l'ordre de clé de hachage ne change pas, vous devriez probablement reconsidérer pourquoi vous devez le faire. p> Peut-être que vous pouvez traiter le hachage en une seule passe au lieu de deux? P> Vous devez enregistrer les clés de hachage dans une matrice en tant que pratique de programmation défensive, à moins que la taille des données ne soit suffisamment grande que la duplication, ce serait un problème. En tant que bonus, vous pouvez même trier la liste facilement et traiter dans le hachage dans un ordre bien défini. Par exemple, p> Cela évite les problèmes de modification du hachage, car votre commande de tableau ne changera jamais si vous le souhaitez. P> Si vous ne le faites pas. Faites cela, vous devez faire très attention à ne pas faire quoi que ce soit qui change le hash, sinon l'ordre des éléments changera. Regardez dans le Module Readonly pour vous assurer que ce hachage n'est jamais modifié. p> p>
Je ne comprends pas - pourquoi devriez-vous être défensif sur une fonctionnalité testée, documentée et garantie ainsi de fonctionner? Cela semble aussi idiot que d'utiliser un éditeur de texte et un fichier appelant -> Safe deux fois dans la ligne d'affichage de l'espoir que si le premier échoue silencieusement, le second réussira.
@Moritz: Le problème n'est pas que Perl modifie l'ordre de clé (ou non), c'est que la commande peut changer si le hachage est modifié. Cette réponse suggère une tactique de programmation défensive (Array séparée plus Readonly) pour un entretien futur du code de base de l'OP et n'a rien à voir avec PerL Internals.
Sauf que des raisons de performance ne soient pas fortes, j'essaie de toujours trier. Été mordu trop souvent par le code qui s'attend implicitement à un certain ordre et commence à défaillonner mystérieusement lorsque des modifications apparemment non liées se produisent dans un autre ordre de clés.
Juste hors de curiosité - pour que avez-vous besoin de cette propriété?
Qui votte tout et quoi que ce soit?