解释以下Perl代码?

时间:2011-06-12 12:00:10

标签: perl

有人可以为我解释以下Perl代码吗? 我认为它在Perl和我对Perl编程没有任何线索。请解释以下代码的作用?

$t = test(10);
sub test() {
  my $str = unpack("B32", pack("N",shift));
  $str2 = substr($str,16,length($str));
  return $str2;
}

4 个答案:

答案 0 :(得分:10)

pack,unpack和substr函数分别记录在hereherehere

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位字符。