Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18068
  • 博文数量: 9
  • 博客积分: 212
  • 博客等级: 入伍新兵
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-19 15:40
文章分类

全部博文(9)

文章存档

2012年(9)

我的朋友

分类:

2012-08-09 15:34:54

试想一个perl应用的小命题:一个有复杂结构的数据对象。如果假设这个数据对象的构成只限于perl的基本数据类型(scalar, array, hash)且无递归,这个问题用perl就很容易解决。

  1. my %data =
  2. (
  3.     a => 1,
  4.     b => [ { b => 1 }, { c => 2 }, 3 ],
  5.     c => { x => [ 1, 3, 2 ], y => 4 }
  6. );

  7. my $copy = deep_copy( \%data );

  8. sub deep_copy
  9. {
  10.     my $data = shift;
  11.     my $ref = ref $data;

  12.     return $ref
  13.         ? $ref eq 'ARRAY'
  14.             ? [ map { deep_copy( $_ ) } @$data ]
  15.             : { map { $_ => deep_copy( $data->{$_} ) } keys %$data }
  16.         : $data;
  17. }
但如果上述假设不成立呢?显然上面的deep_copy()函数无法预见、判断、处理除基本数据类型外的类型;即便数据构成都是基本类型,如果数据是递归的,deep_copy()会跟着无限递归下去!那么如何解决这个数据复制的问题呢?

(data marshalling)泛指将数据转换成一种便于处理和传输的形式的手段。最常见/常用到的数据编组形式是数据的序列化(serialization)。

Perl有多种数据序列化手段。最常见的是Data::Dumper。由Data::Dumper序列化的数据可以通过perl的eval或do恢复数据结构,但使用起来略为蹩脚。YAML::XS可提供更简约的数据编组方式。上述命题可以轻易解决,且对数据无条件限制。


  1. my %data =
  2. (
  3.     a => 1,
  4.     b => [ { b => 1 }, { c => 2 }, 3 ],
  5.     c => { x => [ 1, 3, 2 ], y => 4 }
  6. );

  7. my $copy = deep_copy( \%data );

  8. sub deep_copy
  9. {
  10.     use YAML::XS;
  11.     return YAML::XS::Load( YAML::XS::Dump( shift ) );
  12. }
当然数据编组或序列化的应用不仅局限于此,它是debug/perl程序配置文件/或线程间传输数据的常用手段。
阅读(351) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~