有人可以为我解释下面的Perl代码吗? 我认为它在Perl中,我不知道Perl编程。请解释以下代码的作用?解释下面的Perl代码?
$t = test(10);
sub test() {
my $str = unpack("B32", pack("N",shift));
$str2 = substr($str,16,length($str));
return $str2;
}
有人可以为我解释下面的Perl代码吗? 我认为它在Perl中,我不知道Perl编程。请解释以下代码的作用?解释下面的Perl代码?
$t = test(10);
sub test() {
my $str = unpack("B32", pack("N",shift));
$str2 = substr($str,16,length($str));
return $str2;
}
的打包,解包和SUBSTR功能分别记载here,here和here。
pack("N"...)
将一个数字打包成一个四字节的网络顺序表示。 unpack("B32"...)
将此打包号码解压缩为一串比特(零和一)。调用substr
获取该位串的后半部分(从位16开始),该位表示原始32位数的低16位。
为什么这样做对我来说是个谜。更简单,更快的解决方案是应对一开始(注意小写"n"
)低16位:
sub test($) {
return unpack("B16", pack("n",shift));
}
或者可能不那么令人困惑的'return sprintf“%016b”,shift&0xffff“,它使用其他语言中可以找到的运算符: ) – hobbs 2011-06-12 20:52:19
@ hobbs:好点!你应该把它作为答案。虽然你在'shift'周围或之后需要括号。 – 2011-06-12 22:52:45
除了马塞洛的回答,shift
函数采用@_
作为其默认的参数。 @_
包含子例程的参数。
shift
弹出从传递的参数列表中的第一个参数函数
pack("N", shift)
返回该值的32位网络字节顺序表示
my $str = unpack("B32", pack("N", shift));
存储一个比特串表示(32位值)(即看起来像“00010011”的字符串)。
substr
是越野车,应该是substr($str, 16);
得到上述的最后16个字符。 (或substr($str, 16, 16);
。)
pack("N", shift)
需要函数的参数(移位的返回值,默认情况下它对参数数组起作用)并将其变成一个整数。然后unpack("B32,
部分再次将其转换为32位的字符串,因此是0和1的字符串。在这种情况下,substr
只需要最后的16位字符。
你从哪里得到它的? – ysth 2011-06-12 12:11:42
'sub test {sprintf('%016X',shift&0xFFFF)}'可能更清晰 – ikegami 2013-01-26 13:20:17