免责声明:自从我做了任何perl以来已经很久了,所以如果我要求/说些蠢事,请纠正我。
是否可以查看perl变量的字节/位表示?也就是说,如果我说出像
这样的话my $foo = 'a';
我知道(想想?)计算机将$foo
视为
0b1100010
有没有办法让perl打印出变量的二进制表示?
(不要求任何实际目的,只是修补一位老朋友并试图比1997年更深入地了解它)
答案 0 :(得分:12)
当然,使用unpack:
print unpack "B*", $foo;
示例:
% perl -e 'print unpack "B*", "bar";'
011000100110000101110010
pack和perlpacktut的perldoc页面提供了关于在不同表示之间进行转换的精彩概述。
答案 1 :(得分:2)
如果你想要实际的内部,那么开始的地方是一个名为“perlguts”的文件。 perldoc perlguts
或在此处阅读:http://perldoc.perl.org/perlguts.html
答案 2 :(得分:2)
在看到Andy解释你的问题之后,我可以跟进说Devel::Peek有一个Dump
函数,可以显示变量的内部表示。它不会把它带到二进制级别,但如果你感兴趣的是内部,你可能会看到它。
$ perl -MDevel::Peek -e 'my $foo="a";Dump $foo';
SV = PV(0x7fa8a3004e78) at 0x7fa8a3031150
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x7fa8a2c06190 "a"\0
CUR = 1
LEN = 16
$ perl -MDevel::Peek -e 'my %bar=(x=>"y",a=>"b");Dump \%bar'
SV = IV(0x7fbc5182d6e8) at 0x7fbc5182d6f0
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x7fbc51831168
SV = PVHV(0x7fbc5180c268) at 0x7fbc51831168
REFCNT = 2
FLAGS = (PADMY,SHAREKEYS)
ARRAY = 0x7fbc5140f9f0 (0:6, 1:2)
hash quality = 125.0%
KEYS = 2
FILL = 2
MAX = 7
RITER = -1
EITER = 0x0
Elt "a" HASH = 0xca2e9442
SV = PV(0x7fbc51804f78) at 0x7fbc51807340
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x7fbc5140fa60 "b"\0
CUR = 1
LEN = 16
Elt "x" HASH = 0x9303a5e5
SV = PV(0x7fbc51804e78) at 0x7fbc518070d0
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x7fbc514061a0 "y"\0
CUR = 1
LEN = 16
答案 3 :(得分:2)
还有一种方法:
printf "%v08b\n", 'abc';
输出:
01100001.01100010.0110001
(v标志是perl-only printf / sprintf功能,也适用于b
以外的数字格式。)
这与unpack建议不同,其中字符大于"\xff"
:unpack仅返回8个低位(带警告),printf '%v...'
将显示所有位:
$ perl -we'printf "%vX\n", "\cA\13P\x{1337}"'
1.B.50.1337
答案 4 :(得分:1)
您可以使用ord
返回字符的数值,并使用printf
格式%b
以二进制格式显示该值。
print "%08b\n”, ord 'a'
<强>输出强>
01100010