Как я могу получить количество упакованных предметов в Perl без фактической распаковки? - PullRequest
3 голосов
/ 01 октября 2010

У меня есть строка pack ed значений, которые были созданы последовательно, используя что-то вроде:

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

В другой программе, после загрузки $packed, я хочу выяснить, сколько значений былона самом деле упакован.Я знаю, как это сделать после unpack ing:

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

Но действительно ли это необходимо?Если я забочусь только о количестве значений, могу ли я сделать лучше и пропустить unpack ing?

Ответы [ 3 ]

7 голосов
/ 01 октября 2010

Поскольку вы знаете размер упакованного значения (L - это 32-разрядное целое число без знака или 4 байта), просто разделите длину на размер:

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

Если вы не хотите жестко задавать размер, вы также можете упаковать примерное значение для его вычисления. (Обратите внимание, что свертывание констант во время компиляции в Perl не работает с pack, по крайней мере, с 5.10.1, так что вы захотите выполнить этот расчет только один раз.)

my $size = length(pack('L', 0));
...
my $count = length($packed) / $size;
1 голос
/ 01 октября 2010

Поскольку L - это просто группы 32-битных значений, вы можете просто посчитать количество байтов и разделить на 4.

0 голосов
/ 01 октября 2010
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
...