perl 如何获取解包占用的字节数

uurity8g  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(170)

有没有办法得到'unpack'调用“消耗”的字节数?我只想通过几个步骤从一个长字符串中解析(解包)不同的结构,如下所示:

my $record1 = unpack "TEMPLATE", substr($long_str, $pos);

# Advance position pointer
$pos += NUMBER_OF_BYTES_CONSUMED_BY_LAST_UNPACK();

# Other codes that might determin what to read in following steps
# ...

# Read again at the new position
my $record2 = unpack "TEMPLATE2", substr($long_str, $pos);
tv6aics1

tv6aics11#

这看起来确实像是unpack中的一个明显的遗漏,不是吗?作为安慰,您可以在解包模板的末尾使用a*来返回输入字符串中未使用的部分。

# The variable-length "w" format is to make the example slightly more interesting.
$x = pack "w*", 126..129;
while(length $x) {
    # unpack one number, keep the rest packed in $x
    ($n, $x) = unpack "wa*", $x;
    print $n;
}

如果打包的字符串很长,这不是一个好主意,因为每次解包时都必须复制字符串的“剩余”部分。

xvw2m8pv

xvw2m8pv2#

您可以将字符.添加到格式字符串的末尾:

my (@ary) = unpack("a4v3a*.", "abcdefghijklmn");

say for @ary;

输出量:

abcd
26213
26727
27241
klmn
14 # <-- 14 bytes consumed

这被巧妙地隐藏在perl5100delta文件中。如果它被记录在perlfunc的某个地方,我也找不到它。

相关问题