免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3502 | 回复: 5
打印 上一主题 下一主题

求纯perl实现的Data::Dumper函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-14 20:41 |只看该作者 |倒序浏览
我自己编译了个microperl在嵌入式环境下使用,不支持XS,不能用标准Data:umper.
源码包的 lib目录下有好多模块可用,但找不到简单的纯perl实现的Data:umper
有人见过或者实现过这个吗?谢谢

论坛徽章:
0
2 [报告]
发表于 2010-08-14 22:06 |只看该作者
用ref函数写个?

论坛徽章:
0
3 [报告]
发表于 2010-08-15 12:54 |只看该作者
自己整了个简单用用

  1. use warnings;
  2. use strict;
  3. #use Data::Dumper;


  4. package MyDumper;
  5. sub Dumper{
  6.         md(shift,0);
  7. }
  8. sub output{
  9.         my $base=shift;
  10.         my $data=shift;
  11.         print ' 'x$base,$data;
  12. }
  13. sub md{
  14.         my $p=shift;
  15.         my $base=shift || 0;

  16.         my $type=ref $p;
  17.         if($type eq 'REF'){
  18.                 output(0,'\\');
  19.                 return md($p,$base+1);
  20.         }

  21.         if($type eq 'SCALAR'){
  22.                 if(defined $p){
  23.                         output(0,"\'$p\',\n");
  24.                 }
  25.                 else{
  26.                         output(0,"undef,\n");
  27.                 }
  28.                 return;
  29.         }

  30.         if($type eq 'ARRAY'){
  31.                 output(0,"[\n");
  32.                 for(@$p){
  33.                         if(ref $_){
  34.                                 md($p->{$_},$base+1);
  35.                         }
  36.                         else{
  37.                                 if(defined $_){
  38.                                         output($base+1,"\'$_\',\n");
  39.                                 }
  40.                                 else{
  41.                                         output($base+1,"undef,\n");
  42.                                 }
  43.                         }
  44.                 }
  45.                 output($base-1,"],\n");
  46.                 return;
  47.         }

  48.         if($type eq 'HASH'){
  49.                 my @key=sort keys %$p;
  50.                 my $key_len=0;
  51.                 for(@key){
  52.                         if($key_len<length){
  53.                                 $key_len=length;
  54.                         }
  55.                 }
  56.                 output(0,"{\n");

  57.                 for(@key){
  58.                         output($base,sprintf("%-${key_len}s => ",$_));
  59.                         if(ref $p->{$_}){
  60.                                 md($p->{$_},$base+$key_len+5);
  61.                         }
  62.                         else{
  63.                                 if(defined $p->{$_}){
  64.                                         output(0,"\'$p->{$_}\',\n");
  65.                                 }
  66.                                 else{
  67.                                         output(0,"undef,\n");
  68.                                 }
  69.                         }
  70.                 }
  71.                 output($base-1,"},\n");
  72.                 return;
  73.         }

  74.         if($type eq 'CODE'){
  75.                 output(0,"sub{ DUMMY },\n");
  76.                 return;
  77.         }

  78.         if($type eq 'GLOB'){
  79.                 my $name=*$p;
  80.                 output(0,"\\$name,\n");
  81.                 return;
  82.         }

  83.         if($type eq 'IO::Handle'){
  84.                 output(0,'bless( , \'IO::Handle\' ),'."\n");
  85.                 return;
  86.         }
  87. }
  88. 1;


  89. #use MyDumper;
  90. my $bb="222";
  91. my $foo=\$bb;
  92. print ref $foo;
  93. sub handler{
  94. }
  95. my $cc={
  96.         aa=>1,
  97.         bb=>{d=>{aaaaaaa=>1,bbb=>2}},
  98.         cc=>[1,2,3,4],
  99.         ff=>sub{},
  100.         ee=>\*STDIN,
  101.         ii=>\$foo,

  102.         scalarref => *foo{SCALAR},
  103.         arrayref  => *ARGV{ARRAY},
  104.         hashref   => *ENV{HASH},
  105.         coderef   => *handler{CODE},
  106.         ioref     => *STDIN{IO},
  107.         globref   => *foo{GLOB},
  108. };

  109. MyDumper::Dumper($cc);
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-08-15 12:58 |只看该作者
顺便请教一下 perlref文档里的 $scalarref = *foo{SCALAR}; 为什么是undef?
我的perl版本5.8.8

论坛徽章:
0
5 [报告]
发表于 2010-08-15 20:41 |只看该作者
顺便请教一下 perlref文档里的 $scalarref = *foo{SCALAR}; 为什么是undef?
我的perl版本5.8.8
feilong_36 发表于 2010-08-15 12:58




$foo需要用our声明,不能用my

论坛徽章:
0
6 [报告]
发表于 2010-08-16 19:57 |只看该作者
谢谢
我明白了,typeglob只能用在包的全局变量上,在包外面能访问到的变量.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP