我想在Perl中使用pack()函数来编码一些数据。然后我想将我的打包结构与另一个打包结构进行比较。我想比较这个打包结构的字节值。
根据文档,cmp使用当前区域设置来确定如何比较字符串。但我不希望任何情报应用于比较。我想要最接近memcmp()的东西。显然我不能使用<=>
来比较我的打包对象,因为它们不是数字。
在Perl中比较打包字符串的最佳方法是什么?
旁注:我一直在阅读this article on efficient sorting in Perl,它注意到普通排序函数使用类似memcmp的算法来比较结构。我想知道如何在不使用sort的情况下实现这样的比较。
答案 0 :(得分:5)
禁用块的区域设置注意事项并照常使用cmp
:
sub mycmp {
no locale;
$_[0] cmp $_[1];
}
perlop文档提供
lt
,le
,ge
,gt
和cmp
使用当前区域设置指定的排序规则(排序)顺序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