2011-06-12 82 views
-1

有人可以为我解释下面的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

你从哪里得到它的? – ysth 2011-06-12 12:11:42

+0

'sub test {sprintf('%016X',shift&0xFFFF)}'可能更清晰 – ikegami 2013-01-26 13:20:17

回答

10

的打包,解包和SUBSTR功能分别记载hereherehere

pack("N"...)将一个数字打包成一个四字节的网络顺序表示。 unpack("B32"...)将此打包号码解压缩为一串比特(零和一)。调用substr获取该位串的后半部分(从位16开始),该位表示原始32位数的低16位。

为什么这样做对我来说是个谜。更简单,更快的解决方案是应对一开始(注意小写"n")低16位:

sub test($) { 
    return unpack("B16", pack("n",shift)); 
} 
+2

或者可能不那么令人困惑的'return sprintf“%016b”,shift&0xffff“,它使用其他语言中可以找到的运算符: ) – hobbs 2011-06-12 20:52:19

+0

@ hobbs:好点!你应该把它作为答案。虽然你在'shift'周围或之后需要括号。 – 2011-06-12 22:52:45

1

除了马塞洛的回答,shift函数采用@_作为其默认的参数。 @_包含子例程的参数。

3
shift 

弹出从传递的参数列表中的第一个参数函数

pack("N", shift) 

返回该值的32位网络字节顺序表示

my $str = unpack("B32", pack("N", shift)); 

存储一个比特串表示(32位值)(即看起来像“00010011”的字符串)。

substr是越野车,应该是substr($str, 16);得到上述的最后16个字符。 (或substr($str, 16, 16);。)

0

pack("N", shift)需要函数的参数(移位的返回值,默认情况下它对参数数组起作用)并将其变成一个整数。然后unpack("B32,部分再次将其转换为32位的字符串,因此是0和1的字符串。在这种情况下,substr只需要最后的16位字符。