6

我想使用 Perl 中的pack()函数来编码一些数据。然后我想将我的打包结构与另一个打包结构进行比较。我希望这个比较是在这个打包结构的字节值上。

根据文档,cmp使用当前语言环境来确定如何比较字符串。但我不希望将任何情报应用于比较。我想要最接近 memcmp() 的任何东西。显然我不能<=>用来比较我打包的对象,因为它们不是数字。

在 Perl 中比较压缩字符串的最佳方法是什么?

旁注:我一直在阅读这篇关于 Perl 中高效排序的文章,其中指出普通排序函数使用类似 memcmp 的算法来比较结构。我想知道如何在不必使用排序的情况下实现这样的比较。

4

3 回答 3

5

禁用块的区域设置注意事项并cmp照常使用:

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

perlop文档提供

lt, le, ge,gtcmp使用当前语言环境指定的整理(排序)顺序(如果use locale有效)。请参阅perllocale

然后在perllocale

no locale使用pragma 或到达块封闭的末尾时恢复默认行为use locale

例如,运行

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

输出

-1
1
于 2010-07-20T15:28:02.277 回答
4

展开,然后收缩。例如比较你的结构的十六进制表示,它只使用 ASCII 字符并且不能与你提到的语言环境问题发生冲突。

unpack('H*', $first) cmp unpack('H*', $second)
于 2010-07-20T10:39:28.800 回答
0

在这里大声思考——按位运算符会有帮助吗?就像对两个相同的字符串进行异或运算一样,会得到一个所有设置为 0 的位串。

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

于 2010-07-20T09:36:09.457 回答