有人可以为我解释以下Perl代码吗? 我认为它在Perl和我对Perl编程没有任何线索。请解释以下代码的作用?
$t = test(10);
sub test() {
my $str = unpack("B32", pack("N",shift));
$str2 = substr($str,16,length($str));
return $str2;
}
答案 0 :(得分:10)
pack,unpack和substr函数分别记录在here,here和here。
pack("N"...)
将数字打包成四字节网络顺序表示。 unpack("B32"...)
将此打包数字解包为一串位(零和一)。 substr
调用占用此位串的后半部分(从第16位开始),表示原始32位数的低16位。
为什么这样做对我来说是一个谜。更简单,更快速的解决方案是在开始时处理低16位(注意小写"n"
):
sub test($) {
return unpack("B16", pack("n",shift));
}
答案 1 :(得分:3)
shift
从传递的参数列表中弹出函数的第一个参数
pack("N", shift)
返回该值的32位网络字节顺序表示
my $str = unpack("B32", pack("N", shift));
存储所述值的位串表示(32位)(即看起来像“00010011”的字符串)。
substr
是错误的,应该substr($str, 16);
来获取上述的最后16个字符。 (或substr($str, 16, 16);
。)
答案 2 :(得分:1)
除了Marcelo的回答,shift
函数将@_
作为其默认参数。 @_
包含子例程的参数。
答案 3 :(得分:0)
pack("N", shift)
获取函数的参数(shift的返回值,默认情况下对arguments数组起作用)并使其成为整数。然后unpack("B32,
部分再次成为32位的字符串,所以字符串为0和1。在这种情况下,substr
只占用最后16位字符。