如何比较Perl中的打包值?

时间:2010-07-20 08:48:21

标签: perl compare pack

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

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

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

旁注:我一直在阅读this article on efficient sorting in Perl,它注意到普通排序函数使用类似memcmp的算法来比较结构。我想知道如何在不使用sort的情况下实现这样的比较。

3 个答案:

答案 0 :(得分:5)

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

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

perlop文档提供

  

ltlegegtcmp使用当前区域设置指定的排序规则(排序)顺序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

答案 1 :(得分:4)

Expand, then contract.比较你的结构的十六进制表示,它只使用ASCII字符,不能与你提到的语言环境问题发生冲突。

unpack('H*', $first) cmp unpack('H*', $second)

答案 2 :(得分:0)

在这里大声思考 - 按位运算符会有帮助吗?就像在两个相同的字符串上执行xor一样,将为一个字符串设置为0。

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