代码之家  ›  专栏  ›  技术社区  ›  PP.

如何比较Perl中的压缩值?

  •  6
  • PP.  · 技术社区  · 14 年前

    我想用 pack() Perl中的函数,用于对某些数据进行编码。然后我想比较我的打包结构和另一个打包结构。我希望这个比较在这个打包结构的字节值上。

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

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

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

    3 回复  |  直到 14 年前
        1
  •  5
  •   Greg Bacon    14 年前

    禁用块的区域设置注意事项并使用 cmp 像往常一样:

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

    这个 perlop 文件提供

    lt , le , ge , gt 化学机械抛光 使用当前区域设置指定的排序规则(排序)顺序,如果 use locale 是有效的。见 perllocale .

    然后在 周界

    默认行为将使用 no locale pragma,或在到达块封闭的结尾时 使用场所 .

    例如,运行

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

    输出

    -1
    1
        2
  •  4
  •   daxim Fayland Lam    14 年前

    Expand, then contract. 例如,比较结构的十六进制表示,它只使用ASCII字符,不能与您提到的区域设置问题冲突。

    unpack('H*', $first) cmp unpack('H*', $second)
    
        3
  •  0
  •   deepakg    14 年前

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

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