6
votes

Comment puis-je comparer les valeurs emballées à Perl?

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.

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 <=> pour comparer mes objets emballés car ils ne sont pas des chiffres.

Quelle est la meilleure façon de comparer des cordes emballées à Perl?

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.


5 commentaires

Trier 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.


3 Réponses :


0
votes

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.

http://perldoc.perl.org/perlop.html#cewise -String-opérateurs


1 commentaires

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.



4
votes

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)


0 commentaires

5
votes

Désactiver les considérations locales pour le bloc et l'utilisation cmp comme d'habitude: xxx

le Perlop Documentation fournit

lt , Le , ge , gt et cmP Utilisez la collation Ordre (tri) spécifié par la locale actuelle si utilise locale est en vigueur. Voir Perllocale .

et ensuite dans Perllocale

Le comportement par défaut est restauré avec le aucun paramètre local pragma ou lors de la fin de la fin du bloc enfermé utilise locale . .

Par exemple, exécuter xxx

sorties xxx


2 commentaires

"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 pragma est lexical: il n'est en effet que dans son bloc joint.