Je souhaite utiliser le pack () fonction dans Perl pour encoder certaines données . Ensuite, je veux comparer ma structure emballée à une autre structure emballée. Je veux que cela se comparait à être sur les valeurs d'octets de cette structure emballée. P>
Selon la documentation, CMP utilise les paramètres régionaux actuels pour déterminer comment comparer les chaînes. Mais je ne veux aucune intelligence appliquée à la comparaison. Je veux ce qui est le plus proche d'un memcmp (). Évidemment, je ne peux pas utiliser Quelle est la meilleure façon de comparer des cordes emballées à Perl? P>
sidenote: j'ai lisée Cet article sur le tri efficace dans Perl qui note que la fonction de tri simple utilise un algorithme de type MEMCMP pour la comparaison des structures. Je me demande comment réaliser une telle comparaison sans avoir à utiliser le tri. P> <=> code> pour comparer mes objets emballés car ils ne sont pas des chiffres. P>
3 Réponses :
Penser à haute voix ici - les opérateurs bitwises vont-ils aider? Comme faire un Xor sur deux chaînes identiques donnera un bits de bits avec tout ce qui est réglé sur 0. P>
http://perldoc.perl.org/perlop.html#cewise -String-opérateurs p>
XOR serait un test de grande égalité indépendamment de la locale, en fait - une bonne idée - ne serait pas utile pour moins que / plus grande que cependant.
Développer, puis contrat. comparer par exemple la représentation hexagonale de vos structures, qui utilise uniquement Les caractères ASCII et ne peuvent pas courir au problème du problème des paramètres régionaux que vous mentionnez.
unpack('H*', $first) cmp unpack('H*', $second)
Désactiver les considérations locales pour le bloc et l'utilisation le Perlop Documentation fournit P> et ensuite dans Perllocale P> Le comportement par défaut est restauré avec le Par exemple, exécuter P> sorties p> cmp code> comme d'habitude:
lt code>,
Le code>,
ge code>,
gt code> et
cmP code> Utilisez la collation Ordre (tri) spécifié par la locale actuelle si
utilise locale code> est en vigueur. Voir Perllocale . P>
blockQuote>
aucun paramètre local code> pragma ou lors de la fin de la fin du bloc enfermé
utilise locale code>. p>.
blockquote>
"Aucun local" ne s'applique-t-il que dans la fermeture? S'il y a une locale qui s'applique en dehors de la fermeture, il s'appliquera toujours à n'importe quel code sous la fermeture?
@Pp oui, le locale code> pragma est lexical: il n'est en effet que dans son bloc joint.
Trier code> est vraiment un excellent endroit pour commencer. Essayer de construire votre propre type de tri ne fonctionnera probablement pas aussi bien que vous le souhaitez, car le tri perl a été finement réglé sur des années. Le lien de tri efficace que vous avez donné comprend des instructions sur la manière d'utiliser les structures de données emballées pour accélérer le tri, ce qui est assez intelligent, mais le tri devait prendre beaucoup de temps avant de me consacrer à la maintenance.
Voulez-vous une comparaison (c'est-à-dire inférieure à, supérieure à ou égale à) ou à un test d'égalité Oui ou non?
@gbacon: Je veux quelque chose que je peux commander avec, donc moins que, plus grand que, égal à.
perdoc.perl.org/perllocale.html#the-Utilisation-locale- Pragma - Cela dit que la valeur par défaut est d'ignorer les paramètres régionaux. Où lisez-vous que Perl utilise la locale actuelle? Les docs pour CMP disent également que les paramètres régionaux sont utilisés «uniquement si vous utilisez la locale est en vigueur». Si «Utiliser les paramètres régionaux» est en vigueur, utilisez "Aucun paramètre local" comme suggéré ci-dessous.
@Runrig merci de la réparation de la faute de frappe.