Как сравнить упакованные значения в Perl? - PullRequest
6 голосов
/ 20 июля 2010

Я хочу использовать функцию pack () в Perl для кодирования некоторых данных. Затем я хочу сравнить мою упакованную структуру с другой упакованной структурой. Я хочу, чтобы это сравнение было в байтовых значениях этой упакованной структуры.

Согласно документации, cmp использует текущую локаль, чтобы определить, как сравнивать строки. Но я не хочу, чтобы какой-либо интеллект применялся к сравнению. Я хочу то, что ближе всего к memcmp (). Очевидно, я не могу использовать <=> для сравнения своих упакованных объектов, поскольку они не являются числами.

Каков наилучший способ сравнения упакованных строк в Perl?

Примечание: я читал эту статью об эффективной сортировке в Perl , в которой отмечается, что функция простой сортировки использует memcmp-подобный алгоритм сравнения структур. Мне интересно, как добиться такого сравнения без использования сортировки.

Ответы [ 3 ]

5 голосов
/ 20 июля 2010

Отключить параметры локали для блока и использовать cmp как обычно:

sub mycmp {
  no locale;
  $_[0] cmp $_[1];
}

Документация perlop предоставляет

lt, le, ge, gt и cmp используют порядок сортировки (сортировки), заданный текущим языковым стандартом, если действует use locale.См. perllocale .

, а затем в perllocale

Поведение по умолчанию восстанавливается с помощью прагмы no locale, илипо достижении конца блока, включающего use locale.

Например, при работе

my($one,$two) = map pack("N", $_) => 1, 2;
say mycmp($one, $two);
say mycmp($two, $one);

вывод

-1
1
4 голосов
/ 20 июля 2010

Разверните, затем сверните. Сравните, например, шестнадцатеричное представление ваших структур, которое использует только символы ASCII и не может столкнуться с проблемой локали, которую вы упомянули.

unpack('H*', $first) cmp unpack('H*', $second)
0 голосов
/ 20 июля 2010

Мысли вслух - помогут ли побитовые операторы?Подобно тому, как выполнение xor для двух одинаковых строк даст цепочку битов со всем, установленным в 0.

http://perldoc.perl.org/perlop.html#Bitwise-String-Operators

...