Perl输出复杂数据结构:Data::Dumper,Data::Dump,Data::Printer
输出复杂结构
前两者建议传递数据结构的引用给对应的函数、方法,当然直接传递非引用也不会错。第三个Printer,则可以自动判断是否是引用。 例如,下面的数据结构,一个是复杂的hash,一个是相对简单的匿名数组引用,分别使用这3个模块来输出。 %Config = ( 'auto_commit' => '0','build_dir' => '/home/fairy/.cpan/build','bzip2' => '/bin/bzip2','urllist' => [ 'http://cpan.metacpan.org/',@my_urllist # 将数组my_urllist作为元素 ],'wget' => '/usr/bin/wget',); @my_urllist=('http://mirrors.aliyun.com/CPAN/','https://mirrors.tuna.tsinghua.edu.cn/CPAN/','https://mirrors.163.com/cpan/',@more_urllist # 将数组more_urllist引用作为元素 ); @more_urllist=qw(http://mirrors.shu.edu.cn/CPAN/ http://mirror.lzu.edu.cn/CPAN/ ); $ref_arr=[qw(longshuai wugui fairy xiaofang)]; 1.使用 #!/usr/bin/perl use Data::Dumper; print Dumper(%Config,$abc); 输出结果: $VAR1 = { 'wget' => '/usr/bin/wget','urllist' => [ 'http://cpan.metacpan.org/',[ 'http://mirrors.aliyun.com/CPAN/',[ 'http://mirrors.shu.edu.cn/CPAN/','http://mirror.lzu.edu.cn/CPAN/' ] ] ],'auto_commit' => '0','build_dir' => '/home/fairy/.cpan/build' }; $VAR2 = [ 'longshuai','wugui','fairy','xiaofang' ]; 注意,Dumper()将第一个引用赋值给 如果想要将默认的 2.使用 #!/usr/bin/perl use Data::Dumper; print Data::Dumper->Dump([%Config,$ref_arr],[qw(myvar myarr)]); 以下是输出结果: $myvar = { 'wget' => '/usr/bin/wget',[ 'http://mirrors.aliyun.com/CPAN/',[ 'http://mirrors.shu.edu.cn/CPAN/','http://mirror.lzu.edu.cn/CPAN/' ] ] ] }; $myarr = [ 'longshuai','xiaofang' ]; 注意上面用了两个数组引用,第一个数组引用是待输出的复杂数据结构,第二个数组引用是定义前一个数组引用的变量名称。 例如,下面的Dump方法,myvar定义 print Data::Dumper->Dump([%Config,@name1,@name2],[qw(myvar,myarr)]); 3.使用 例如,输出数组引用: #!/usr/bin/perl use Data::Dump qw(dump); print dump($ref_arr); 输出结果: ["longshuai","wugui","fairy","xiaofang"] 输出hash引用: { auto_commit => 0,build_dir => "/home/fairy/.cpan/build",bzip2 => "/bin/bzip2",urllist => [ "http://cpan.metacpan.org/",[ "http://mirrors.aliyun.com/CPAN/","https://mirrors.tuna.tsinghua.edu.cn/CPAN/","https://mirrors.163.com/cpan/",[ "http://mirrors.shu.edu.cn/CPAN/","http://mirror.lzu.edu.cn/CPAN/",],wget => "/usr/bin/wget",} 输出hash引用和匿名数组结果: ( { auto_commit => 0,urllist => [ "http://cpan.metacpan.org/",[ "http://mirrors.aliyun.com/CPAN/",[ "http://mirrors.shu.edu.cn/CPAN/",},["longshuai","xiaofang"],) 4.使用
例如: p(%Config) # 正确 p($ref_Config) # 正确 p(%Config) # 错误 p($ref_arr,$ref_Config) # 错误 首先安装这个模块: shell> cpan -i Data::Printer 直接传递数据对象: use Data::Printer; p(%Config) 以下是输出: { auto_commit 0,build_dir "/home/fairy/.cpan/build",bzip2 "/bin/bzip2",urllist [ [0] "http://cpan.metacpan.org/",[1] [ [0] "http://mirrors.aliyun.com/CPAN/",[1] "https://mirrors.tuna.tsinghua.edu.cn/CPAN/",[2] "https://mirrors.163.com/cpan/",[3] [ [0] "http://mirrors.shu.edu.cn/CPAN/",[1] "http://mirror.lzu.edu.cn/CPAN/" ] ] ],wget "/usr/bin/wget" } 传递引用变量: p($ref_arr); 以下是结果: [ [0] "longshuai",[1] "wugui",[2] "fairy",[3] "xiaofang" ] 让Dumper和eval结合由于 例如: print DATA Dumper(%Config); 它将 open DATA,"<$datafile" or die "$!"; { local $/; %new_Config = %{ eval <DATA> }; } 上面的eval使得perl去编译读取到的DATA,因为DATA是由Dumper出去的数据,它们都是变量开头的,所以 但是上面的语句还有点问题,因为有时候持久化的文件可能会是空的,这时就会报错eval那里就会报错。为了健壮性,不得不加入更多的逻辑判断。 比如,下面先将DATA的内容当作字符串赋值给变量变量 open DATA,"<$datafile" or die "$!"; my $dumped_hash; { local $/; $dumped_hash = <DATA>; } my %new_Config = %{ eval $dumped_hash } if $dumped_hash; 但是,以下是我见过最亮瞎狗眼的写法: %new_Config = %{ +eval { <DATA> } }; 用eval进行错误捕获,如果DATA不为空,则返回赋值后的变量 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |