我有一串pack ed值,它是使用类似的顺序创建的:

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

在另一个程序中,加载$packed后,我希望找出实际打包了多少个值。我知道unpack编码后该怎么做:
my @vals = unpack( 'L*', $packed );
print scalar(@vals);

但是真的有必要吗?如果我只关心值的数量,是否可以做得更好并且跳过unpack编码?

最佳答案

由于您知道打包值的大小(L是无符号的32位int或4个字节),因此只需将长度除以大小即可:

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

如果您不想对大小进行硬编码,则还可以打包一个样本值以进行计算。 (请注意,Perl的编译时常量折叠不适用于pack,至少不适用于5.10.1,因此您只想执行一次该计算。)
my $size = length(pack('L', 0));
...
my $count = length($packed) / $size;

09-12 18:55