如何比较 Perl 中的打包值?

发布于 2024-09-10 13:45:17 字数 580 浏览 8 评论 0原文

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

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

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

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

I want to use the pack() function in Perl to encode some data. Then I want to compare my packed structure to another packed structure. I want this compare to be on the byte values of this packed structure.

According to the documentation, cmp uses the current locale to determine how to compare strings. But I don't want any intelligence applied to the comparison. I want whatever is closest to a memcmp(). Obviously I cannot use <=> for comparing my packed objects as they are not numbers.

What is the best way to compare packed strings in Perl?

Sidenote: I have been reading this article on efficient sorting in Perl which notes that the plain sort function uses a memcmp-like algorithm for comparing structures. I'm wondering how to achieve such a comparison without having to use sort.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

忆离笙 2024-09-17 13:45:17

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

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

perlop 文档提供

ltlegegtcmp 使用排序规则如果 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

Disable locale considerations for the block and use cmp as usual:

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

The perlop documentation provides

lt, le, ge, gt and cmp use the collation (sort) order specified by the current locale if use locale is in effect. See perllocale.

and then in perllocale

The default behavior is restored with the no locale pragma, or upon reaching the end of block enclosing use locale.

For example, running

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

outputs

-1
1
酷遇一生 2024-09-17 13:45:17

先扩展,然后收缩。 例如,比较结构的十六进制表示形式,它仅使用 ASCII 字符和不能与您提到的区域设置问题发生冲突。

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

Expand, then contract. Compare for example the hex representation of your structures, which only uses ASCII characters and cannot run afoul of the locale problem you mention.

unpack('H*', $first) cmp unpack('H*', $second)
离不开的别离 2024-09-17 13:45:17

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

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

Thinking aloud here - will bitwise operators help? Like doing a xor on two identical strings will give a bitstring with everything set to 0.

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文