在P中解析Python的序列化对象

2024-04-16 23:17:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要让我的Perl代码读取一些Python的序列化对象,以便以后处理。我提供了基于Parse::MGC的解析器,但是它很慢。可能是我做错了,也可能是有人知道用某种Perl结构转换Python序列化对象的更好方法?在

这里是我的代码:

package Room::HandParser;
use base qw( Parser::MGC );

my @poker_cards_string = ( '2h', '3h', '4h', '5h', '6h', '7h', '8h', '9h', 'Th', 'Jh', 'Qh', 'Kh', 'Ah', '2d', '3d', '4d', '5d', '6d', '7d', '8d', '9d', 'Td', 'Jd', 'Qd', 'Kd', 'Ax', '2c', '3c', '4c', '5c', '6c', '7c', '8c', '9c', 'Tc', 'Jc', 'Qc', 'Kc', 'Ac', '2s', '3s', '4s', '5s', '6s', '7s', '8s', '9s', 'Ts', 'Js', 'Qs', 'Ks', 'As' );

sub parse_declaration {
  my $self = shift;

  [  
    $self->any_of(
      sub { $self->token_int },
      sub { $self->token_string },
    ),
    $self->expect(":"),
    $self->parse,
  ]
}

sub parse_hash {
  my $self = shift;

  my %ret;
  $self->list_of(",", sub {
      my $res = $self->parse_declaration;
      $ret{$res->[0]} = $res->[2];
  });

  return \%ret;
}


sub parse_cards {
  my $self = shift;
  my $card = $self->token_int;
  return $poker_cards_string[$card & 0x3F];
}

sub parse {
  my $self = shift;

  $self->any_of(
    sub { $self->scope_of( "[", sub { $self->list_of(",", \&parse) }, "]" ) },
    sub { $self->scope_of( "(", sub { $self->list_of(",", \&parse) }, ")" ) },
    sub { $self->scope_of( "{", sub { $self->parse_hash }, "}" ) },
    sub { $self->scope_of( "PokerCards([", sub { $self->list_of(",", \&parse_cards) }, "])" ) },
    sub { $self->token_float },
    sub { $self->token_int },
    sub { $self->token_string },
    sub { $self->token_kw( qw(None True False) ) },
  );
}

1;

下面是我需要解析的序列化Python对象的示例:

^{pr2}$

对于这种结构,它需要几秒钟和100%的CPU来解析这个对象,这在我的例子中是不可接受的。在

编辑:这里我不是在寻找解决方法,比如编写python脚本来评估这个结构并将其输出为JSON,或者用添加的函数重写原始python应用程序以将数据存储为JSON。我希望用Perl以合理的性能解析这些数据,因为这种格式非常接近JSON,应该可以在类似的时间解析它。在


Tags: of对象selftokenstringshift序列化parse
2条回答

如果有人感兴趣的话:我最后得到了一些regexp,它们将这个字符串转换成JSON(因为它们看起来非常接近),然后用JSON::XS解析它。https://github.com/hippich/Bitcoin-Poker-Room/commit/2f0e089908d3fa71dc16021ac6a24807c46529ad#diff-1}}parse_hands()子例程。在

你用不同的格式怎么样?例如,JSON非常容易解析,Perl中的一些实现应该是现成的。Python内置了JSON序列化和反序列化,因此您也不必在那里重新设计轮子。在

相关问题 更多 >