Perl打包/解包和二进制字符串的长度

sda*_*aau 3 perl bytearray unpack pack

考虑这个简短的例子:

$a = pack("d",255);
print length($a)."\n";
# Prints 8

$aa = pack("ddddd", 255,123,0,45,123);
print length($aa)."\n";
# Prints 40

@unparray = unpack("d "x5, $aa);
print scalar(@unparray)."\n";
# Prints 5

print length($unparray[0])."\n"
# Prints 3

printf "%d\n", $unparray[0] '
# Prints 255

# As a one-liner:
# perl -e '$a = pack("d",255); print length($a)."\n"; $aa = pack("dd", 255,123,0,45,123); print length($aa)."\n"; @unparray = unpack("d "x5, $aa); print scalar(@unparray)."\n"; print length($unparray[0])."\n"; printf "%d\n", $unparray[0] '
Run Code Online (Sandbox Code Playgroud)

现在,我希望双精度浮点数为8个字节,所以第一个length($a)是正确的.但是为什么unpack(length($unparray[0]))报告3 之后的长度- 当我试图以完全相同的方式返回时(双精度,即8个字节) - 并且项目(255)的值被正确保留?

hob*_*bbs 5

通过解压缩你打包的内容,你得到了原始值,第一个值是255. 255的字符串化是"255",这是3个字符长,这就是length告诉你的.

  • @sdaau,你会在`@ unparray`中获得双精度浮点数.`length`查找字符串的长度,因此它需要一个字符串,因此如果需要,它将对其参数进行字符串化. (4认同)