我有一串pack
ed值,这些值是使用以下内容顺序创建的:
while (...) {
...
$packed .= pack( 'L', $val );
}
在另一个程序中,在我加载$packed
之后,我想知道实际打包了多少个值。我知道在unpack
之后如何做到这一点:
my @vals = unpack( 'L*', $packed );
print scalar(@vals);
但是真的有必要吗?如果我只关心值的数量,我可以做得更好并跳过unpack
ing?
答案 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