2012-03-22 2 views
1

Не знакомый вообще с Python, мне было интересно, сможет ли кто-нибудь предоставить исходный атрибут perl следующего кода на Python?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

+0

@John, ну, это очень хрупким, так как я переопределяя конструктор, но это необходимо для того, чтобы использовать P :: S :: Pickle (не говоря уже о записи на диск, конечно). – ikegami

2

Это было давно (более десяти лет), так как я смотрел на perl всерьез.

Так что я опишу вместо:

  • данных небольшой произвольной структуры данных строки и массив целых чисел в массиве
  • данных сериализации с использованием бинарного языка конкретной схемы упаковки (pickle), который может упаковывать произвольные данные и код
  • длина сериализованных данных вычисляется и преобразуется в бинарный формат big-endian 4 байт.
  • бинарное представление длины и сериализованные данные сцепляются

Похоже основе протокола линии. Код приема будет читать 4 байта, распаковать длину полезной нагрузки, прочитать байты длины полезной нагрузки. Распакуйте полезную нагрузку.

Смежные вопросы