输出复杂结构

Data::DumperData::DumpData::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.使用Data::Dumper的Dumper函数,期待的是引用

#!/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/','https://mirrors.tuna.tsinghua.edu.cn/CPAN/','https://mirrors.163.com/cpan/',['http://mirrors.shu.edu.cn/CPAN/','http://mirror.lzu.edu.cn/CPAN/']]],'bzip2' => '/bin/bzip2','auto_commit' => '0','build_dir' => '/home/fairy/.cpan/build'};$VAR2 = ['longshuai','wugui','fairy','xiaofang'];

注意,Dumper()将第一个引用赋值给$VAR1,第二个引用赋值给$VAR2。例如:

如果想要将默认的$VAR修改为自定义的变量名称,可以使用Data::Dumper->Dump方法。

2.使用Data::Dumper的Dump方法,期待两个数组引用,第二个数组引用用来定义现实的变量名,而不是默认的VAR

#!/usr/bin/perl
use Data::Dumper;print Data::Dumper->Dump([\%Config,$ref_arr],[qw(myvar myarr)]);

以下是输出结果:

$myvar = {'wget' => '/usr/bin/wget','auto_commit' => '0','bzip2' => '/bin/bzip2','build_dir' => '/home/fairy/.cpan/build','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/']]]};
$myarr = ['longshuai','wugui','fairy','xiaofang'];

注意上面用了两个数组引用,第一个数组引用是待输出的复杂数据结构,第二个数组引用是定义前一个数组引用的变量名称。

例如,下面的Dump方法,myvar定义\%Config的输出变量名称,myarr定义\@name1的输出变量名称,\@name2没有对应的变量名称,所以使用默认的$VAR3来输出。

print Data::Dumper->Dump([\%Config,\@name1,\@name2],[qw(myvar,myarr)]);

3.使用Data::Dump的dump方法,它输出时不会将输出结果赋值给标量变量,而是直接输出数据结构,有什么就输出什么

例如,输出数组引用:

#!/usr/bin/perl
use Data::Dump qw(dump);print dump($ref_arr);

输出结果:

["longshuai", "wugui", "fairy", "xiaofang"]

输出hash引用:print dump(\%Config);

{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引用和匿名数组结果:print dump(\%Config,$ref_arr);

({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",},["longshuai", "wugui", "fairy", "xiaofang"],
)

4.使用Data::Printerp函数,它会直接输出结果,无需额外的print或say

  • p函数可以直接传递数据对象
  • 如果传递的是引用,则必须是引用变量,而不能是反斜线开头的引用
  • p函数不能同时格式化输出两个对象

例如:

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结合

由于Data::Dumper以及Data::Dump的输出中会包含变量,所以如果将dump出的结果持久化保存到文本后,可以在读取时使用eval将其直接构建成新的数据结构。

例如:

print DATA Dumper(\%Config);

它将%Config的内容持久化到文件句柄DATA连接的文件中。当需要时,读取它并解除引用:

open DATA, "<$datafile" or die "$!";
{local $/;%new_Config = %{ eval <DATA> };
}

上面的eval使得perl去编译读取到的DATA,因为DATA是由Dumper出去的数据,它们都是变量开头的,所以eval <DATA>编译读取的内容后先进行赋值,然后返回赋值完成的类似$VAR1变量,由于这个标量变量是在解除引用的结构中,所以将新构建一个hash对象。

但是上面的语句还有点问题,因为有时候持久化的文件可能会是空的,这时就会报错eval那里就会报错。为了健壮性,不得不加入更多的逻辑判断。

比如,下面先将DATA的内容当作字符串赋值给变量变量$dumped_hash,然后判断这个变量。

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不为空,则返回赋值后的变量$VAR1,前面加一个+得到+$VAR1,这个加号显式提示perl这是一个匿名hash,而不是一次性的语句块结构。然后解除引用。

Perl输出复杂数据结构:Data::Dumper,Data::Dump,Data::Printer相关推荐

  1. Perl Data::Dumper模块介绍

    Perl的Data:Dumper用来显示变量的数据结构,对于检查对象的有关数据时会很有用. #!/usr/bin/perl use Data::Dumper; use strict; my $my_s ...

  2. XML::Simple与Data::Dumper在Perl中的使用

    在perl中使用XML::Simple与Data::Dumper对XML文件进行操作. foo.xml文件,内容如下: <servers>        <server>   ...

  3. FATAL ERROR: please install the following Perl modules before executing ...: Data::Dumper

    问题内容: FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_instal ...

  4. [trouble shooting] mysqlhotcopy 报错 Can't locate Data/Dumper.pm in @INC

    问题 我想要用mysql的一个工具 [root@localhost bin]# ./mysqlhotcopy Can't locate Data/Dumper.pm in @INC (@INC con ...

  5. RPM 安装 mysql 出现 Can‘t locate Data/Dumper.pm in @INC (@INC contains

    今天我在CentOS7 上安装mysql时执行 scripts/mysql_install_db –basedir=/usr/local/mysql –datadir=/usr/local/mysql ...

  6. Can't locate Data/Dumper.pm in @INC (@INC contains:

    执行 pt-query-digest slow.log > digest.log 命令时报错: [root@CentOS-CLI-MySql data]# pt-query-digest slo ...

  7. 使用Data::Dumper

    == use strict; use warnings;use Data::Dumper;my %hash = ('name' => 'zdd','id' => 1234, );print ...

  8. mysql load data 语法_MySql LOAD DATA 使用

    load的语法 LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO ...

  9. Corrupt JPEG data: premature end of data segment

    在跑 LSTR 的效果时 , 用 tusimple数据集(1280720)正常,换成自集的数据集(12801080),出现 Corrupt JPEG data: premature end of da ...

最新文章

  1. poj1286(纯Polya定理)
  2. python简单代码hello-[代码全屏查看]-python初学之helloworld
  3. 8月25号 工作计划与实行
  4. Understanding JVM Internals---不得不转载呀
  5. 远程监督关系抽取漫谈:结合知识图谱和图神经网络
  6. SQuAD文本理解挑战赛十大模型解读
  7. Java教程:影响MySQL性能的配置参数
  8. [FFmpeg] ffmpeg 常用命令
  9. SEO中HTML标签权重列表
  10. ASP.NET Core的身份认证框架IdentityServer4--(5)自定义用户登录(通过接口登录,无UI版本)...
  11. Android GridView示例
  12. mac系统一些快捷键
  13. 三、 CSS3流星雨划过动画特效
  14. HDU 6318 Swaps and inversions
  15. Cirium分析:航空公司和机场重返准点率竞赛
  16. 购买计算机如何选择CPU,怎么选购笔记本电脑CPU 选购笔记本电脑CPU方法【详解】...
  17. python 频数表_python里计算每个数字出现的频数
  18. 一个数据库超全,支持免费高速下载专利的资源库--欧洲专利局Espacenet
  19. [图]Microsoft Word 历史版本纵览
  20. 无线网服务器mac是什么原因,苹果笔记本上网很慢怎么回事?macbook无线上网慢的解决方法...

热门文章

  1. mybatis jdbctype数据类型_mybaits-mybatis配置
  2. 计算机专业考研知识大全,2019计算机专业考研备考知识点
  3. vue打包后css路径_Vue打包后访问静态资源路径问题
  4. java 连接 postgresql_java如何连接数据库并对其操作(以PostgreSQL为例)
  5. 长安大学二级c语言考试题,长安大学03-04C语言A卷试题
  6. mysql+enable+sql+log_CentOS7下利用rsyslog+loganalyzer配置日志服务器及Linux和windows客户端配置...
  7. python数组求和函数_python数据分析之Numpy数据库第三期数组的运算
  8. opencv 人脸识别_人工智能-OpenCV+Python实现人脸识别(视频人脸检测)
  9. 中国超细旦丝现状调研及投资前景评估报告2022-2028年版
  10. python同花顺交易接口是什么_我用 Python 预测了股票价格