Perl输出复杂数据结构:Data::Dumper,Data::Dump,Data::Printer
输出复杂结构
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.使用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::Printer
的p
函数,它会直接输出结果,无需额外的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的更多相关文章
- centos 7安装mysql 执行./scripts/mysql_install_db --user=mysql 报错 FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db: Data::Dumper
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql FATAL ERROR: please install the fol ...
- FATAL ERROR: please install the following Perl modules before executing ./mysql_install_db: Data::Dumper
今天安装本地数据库,所遇到的错误 FATAL ERROR: please install the following Perl modules before executing ./mysql_ins ...
- Linux下安装mysql时报错:FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db:Data::Dumper
如题,安装mysql过程中,执行scripts/mysql_install_db --user=mysql命令时报错: FATAL ERROR: please install the followin ...
- Linux 安装MySql启动Can't locate Data/Dumper.pm in @INC
通过RPM包CentOS7 安装MySQL的时候提示“Can't locate Data/Dumper.pm in @INC (@INC contains: /usr/local/lib64/perl ...
- Can't locate Data/Dumper.pm in perl5的处理
Can't locate Data/Dumper.pm in perl5的处理 wget http://www.cpan.org/modules/by-module/Data/Data-Dumper- ...
- 安装mysql_cluster报错: Data::Dumper丢失
步骤 安装包:mysql-cluster-gpl-7.3.5-linux-glibc2.5-x86_64.tar.gz 下载解压到/usr/local/mysql mkdir /usr/local/m ...
- 初始化mysql数据库提示缺少Data:dumper模块解决方法
初始化默认数据库运行此命令:/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ 出现错 ...
- 以Excel 作为Data Source,将data导入db
将Excel作为数据源,将数据导入db,是SSIS的一个简单的应用,下图是示例Excel,数据列是code和name 第一部分,Excel中的数据类型是数值类型 1,使用SSDT创建一个package ...
- 17.1.1.6 Creating a Data Snapshot Using Raw Data Files 创建一个数据快照使用 Raw Data Files
17.1.1.6 Creating a Data Snapshot Using Raw Data Files 创建一个数据快照使用 Raw Data Files 如果数据库是大的, 复制raw 数据文 ...
随机推荐
- Java File类与文件IO流总结
1.File类 File类被定义为“文件和目录路径名的抽象表示形式”,这是因为File类既可以表示“文件”也可以表示“目录”,他们都通过对应的路径来描述.通过构造函数创建一个File类对象,则该对象就 ...
- github install
1.安装git依赖包 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUti ...
- CentOS7 安装配置rsync
centos7自带rsync,今天简单记录下. rsync安装配置步骤 服务器端: 1.修改默认配置文件/etc/rsyncd.conf,该成如下: # /etc/rsyncd: configurat ...
- Java 8 特性
1.简介 毫无疑问,Java 8是自Java 5(2004年)发布以来Java语言最大的一次版本升级,Java 8带来了很多的新特性,比如编译器.类库.开发工具和JVM(Java虚拟机).在这篇教程 ...
- 12-Python操作json
1.概述 Python操作json文件在测试中会经常用到,那么python怎么操作json文件呢,今天就来简单了解一下.Python中提供了dumps.dump.loads.load,用于字符串 和 ...
- day20_雷神_django第三天
django第三天 动态路由,实现统一删除功能 urls url(r'^host_del/(host|user|group)/(\d+)$',views.host_del,name='del'), t ...
- API网关-Ocelot概述
这个框架的整体思路其实就是Redirect请求并且附带一个简易的负载均衡机制,完全搭建MVC Core项目下在Ocelot项目启动的时候需要配置所有的ReRoute集合,这里的每一个ReRoute可以 ...
- win10个人助理conrtana软件能否支持用户反馈、后续优化
上网查找了一下,win10的个人助理不支持用户反馈.这些反馈都是用户通过别的途径来发表反馈的信息,这个缺陷让用户不是特别满意,因为反馈信息不再那么简答,变得越来越繁琐.有些人还会担心自己反馈的问题会不 ...
- buildbot环境搭建—master篇
好久没写博客来,最近没有深入研究东西,所以写不出什么特别有技术含量的东西,但是,每周出产博客的习惯不能荒废掉,所以就写一下,这个星期学习的简单到东西. 关于buildbot,它是基于python的一个 ...
- 关于Spring Cloud的核心特性
SOA和微服务的区别 其实服务化架构已经可以解决大部分企业的需求了,那么我们为什么要研究微服务呢?先说说它们的区别: 微服务架构强调业务系统需要彻底的组件化和服务化,一个组件就是一个产品,可以独立对外 ...