3

pack次のようなものを使用して順次作成された ed 値の文字列があります。

while (...) {
 ...
 $packed .= pack( 'L', $val );
}

別のプログラムでは、 をロードした後$packed、実際にパックされた値の数を知りたいと考えています。unpack私はing後にそれを行う方法を知っています:

my @vals = unpack( 'L*', $packed );
print scalar(@vals);

しかし、それは本当に必要ですか?値の数だけを気にする場合は、unpacking をスキップしてもっとうまくやることはできますか?

4

3 に答える 3

7

パックされた値 (L符号なし 32 ビット int、つまり 4 バイト) のサイズがわかっているので、長さをサイズで割ります。

my $count = length($packed) / 4;

サイズをハードコーディングしたくない場合は、サンプル値をパックして計算することもできます。(Perl のコンパイル時の定数の折り畳みはpack、少なくとも 5.10.1 では機能しないことに注意してください。そのため、その計算は 1 回だけ実行する必要があります。)

my $size = length(pack('L', 0));
...
my $count = length($packed) / $size;
于 2010-09-30T21:07:37.033 に答える
-1
use constant LLength => length(pack("L", 0));
...
print length($packed)/LLength;

LLengthが本当に一定かどうかを確認します。

$ perl -MO=Deparse,-d -e'use constant L => length(pack("L", 0));print L, "\n";'
sub L () { 4 }
use constant ("L", length pack("L", 0));
print 4, "\n";
-e syntax OK
于 2010-10-01T09:23:24.037 に答える