如何在不实际拆包的情况下获取Perl中的打包物品数量?

时间:2010-09-30 20:59:13

标签: perl pack unpack

我有一串pack ed值,这些值是使用以下内容顺序创建的:

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

在另一个程序中,在我加载$packed之后,我想知道实际打包了多少个值。我知道在unpack之后如何做到这一点:

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

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

3 个答案:

答案 0 :(得分:7)

由于您知道打包值的大小(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;

答案 1 :(得分:1)

由于L只是32位值的组,因此您可以简单地计算字节数并除以4。

答案 2 :(得分:-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
相关问题