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

Dav*_*d B 3 perl unpack pack

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

while (...) {
 ...
 $packed .= pack( 'L', $val );
}
Run Code Online (Sandbox Code Playgroud)

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

my @vals = unpack( 'L*', $packed );
print scalar(@vals);
Run Code Online (Sandbox Code Playgroud)

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

cjm*_*cjm 7

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

my $count = length($packed) / 4;
Run Code Online (Sandbox Code Playgroud)

如果您不想硬编码大小,您还可以打包一个样本值来计算它.(请注意,Perl的编译时常量折叠不起作用pack,至少不适用于5.10.1,因此您只想进行一次计算.)

my $size = length(pack('L', 0));
...
my $count = length($packed) / $size;
Run Code Online (Sandbox Code Playgroud)