6

Perl でpack()関数を使用してデータをエンコードしたいと考えています。次に、パック構造を別のパック構造と比較したいと思います。この比較は、このパックされた構造体のバイト値に対して行う必要があります。

ドキュメントによると、cmpは現在のロケールを使用して文字列を比較する方法を決定します。しかし、比較にインテリジェンスを適用したくありません。memcmp() に最も近いものが欲しい。明らかに<=>、パックされたオブジェクトは数値ではないため、比較には使用できません。

Perlでパックされた文字列を比較する最良の方法は何ですか?

補足: Perl での効率的な並べ替えに関するこの記事を読みました。この記事では、単純な並べ替え関数が構造の比較に memcmp のようなアルゴリズムを使用していることに注意しています。ソートを使用せずにこのような比較を行う方法を考えています。

4

3 に答える 3

5

ブロックのロケールに関する考慮事項を無効にしてcmp、通常どおり使用します。

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

perlopのドキュメントでは、

ltlegegtおよびが有効なcmp場合、現在のロケールで指定された照合 (ソート) 順序を使用しますuse localeperllocaleを参照してください。

そしてperllocaleで

no localeプラグマを使用するか、 を囲むブロックの終わりに到達すると、デフォルトの動作が復元されます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文字のみを使用し、言及したロケールの問題に違反することのない構造の16進表現を比較してください。

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

ここで声を出して考えてください-ビット演算子は役に立ちますか?2つの同一の文字列に対してxorを実行するのと同様に、すべてが0に設定されたビット文字列が得られます。

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

于 2010-07-20T09:36:09.457 に答える