2012-03-22 42 views
1

不熟悉Python,我想知道是否有人可以提供以下python代码的原始perl equiv?Perl等于这个Python代码

谢谢。

data = [("somestring.data", (178346464,1234568))] 
serialized_data = cPickle.dumps(data, protocol=-1) 
length_prefix = struct.pack("!L", len(serialized_data)) 
message = length_prefix + serialized_data 

回答

4

未经测试。

use Python::Serialise::Pickle qw(); 

# Work around P::S::Pickle 0.01's extremely limiting interface. 
sub pickle_dumps { 
    open(my $fh, '>', \my $s) or die $!; 
    my $pickle = bless({ _fh => $fh }, 'Python::Serialise::Pickle'); 
    $pickle->dump($_[0]); 
    $pickle->close(); 
    return $s; 
} 

my $data = [ "somestring.data", [ 178346464, 1234568 ] ]; 
my $message = pack("N/a*", pickle_dumps($data)); 
+0

+1爱的解决方法,以P ::与s ::泡菜的唯一文件限制 – John 2012-04-20 18:58:09

+0

@约翰,嗯,这是很脆弱的,因为我重写构造,但为了使用普的必要:: S :: Pickle(当然,实际上写入磁盘的时间很短)。 – ikegami 2012-04-20 19:35:25

2

自从我认真研究perl以来已经很长时间了(十多年了)。

所以,我会代替描述:

  • 数据是一个字符串的任意小的数据结构和整数数组中数组
  • 数据是用二进制语言特定的包装方案连载( pickle)可以打包任意数据和代码
  • 序列化数据的长度被计算并转换成二进制格式big-endian 4字节。
  • 长度的二进制表示和所述串行化数据被级联

看起来像一条线协议的基础。接收代码将读取4个字节,解包净荷长度,读取净荷长度字节。解包净荷。