下述信息,仅供自己编写新脚本之前的回顾内容。编写perl脚本,处理好下面介绍的内容,那么脚本阅读性就完全满足个人眼光了。
虽然perl有很多实用的模块,可以利用;但是不使用模块编写代码,更容易理解。
变量
无非就是标量、数组、散列。
- 散列是以字符串作为索引的。
- 这里建议:建立新变量的时候,赋值为空。即使用到的所有变量,都不能undef。(或者判断变量是否满足什么条件时,推荐用defined先判别变量值是否undef,否则会引起不必要的麻烦)
- 相关变量集合,尽量用散列来吸收;不要定义太多变量。这样方便理解,更方便perl -d做debug分析的时候,watch这个变量。
- 变量命名,最好统一使用一个规则。个人推荐帕斯卡命名法;如果加一个小写字母表明变量类型就更好了。
关于散列和数组的数据类型,如何选用?
个人理解,索引号简单(即索引号有规律)的就用二维数组;索引号复杂的就用散列。
hash和二维数组的简单用法,参见:
简述perl的引用(包括标量、数组、hash等数据类型的引用) - 学而不思则罔,思而不学则殆 - 博客频道 - CSDN.NET
http://blog.csdn.net/u011729865/article/details/71308170
环境变量的传递
环境变量,在perl里就是散列类型。
%ENV
$ENV{'key'}="value";
但是该方法只能在该进程中有效,当退出该进程时,赋值将不会继续存在;同时其它进程也不会知道此次赋值。
文件
用open就挺方便;记着是三个参数就行,配合or die
检查文件是否打开成功。
比如:
open my $FileXXX, "<","/home/XXX.dat" or die "Error: Cannot open this file";
while(<$FileXXX>){
chomp($_);//根据下文,确认需要保留换行符。可选择删除换行符。有时候需要,有时候也不需要。
.....
}
文件目录、文件名、路径的解析操作
用shell命令,就挺方便。
File::Basename
命令行参数
Getopt::Long模块是用于解析命令行参数的perl模块。
详情见:
http://blog.csdn.net/u011729865/article/details/59169766
例如:
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my @libs = ();
my %flags = ();
my ( $verbose, $all, $more, $diam, $debug, $test, $step, $aa);
GetOptions(
'verbose+' => \$verbose,
'more!' => \$more,
'debug:i' => \$debug,
'lib=s' => \@libs,
'flag=s' => \%flags,
'test|t' => \$test,
'all|everything|universe' => \$all,
'aa' => \$aa,
);
调用shell命令
用反撇号`,返回值是内部print或者echo等形式产生的。
可以利用管道符|,或者| xargs -i echo {};强制产生返回值。
虽然调用非perl内置命令,会导致程序在不同系统(比如linux、windows)移植上出现问题。
但是,个人常用的perl脚本,只会应用到linux系统里。所以,个人更习惯使用shell、grep、sed、awk等命令结合的方式。这也是符合perl语言的定位,支持脚本实现采用“条条大道通罗马”方式。
变量的debug
可选Smart::Comment模块
主体结构的划分
- 主程序划分为多个子程序
- 子程序的参数传递,尽量用散列来吸收;不要定义太多变量。这样方便理解,更方便perl -d做debug分析的时候,watch这个变量。例如:
sub configuration {
my %options = @_;
print "Maximum verbosity.\n" if $options{VERBOSE} == 9;
}
configuration(PASSWORD => 'xyzzy', VERBOSE => 9, SOCRE => 0);
- 子程序以package方式调用,例如:
编写简单package的模板
包,一般起名叫packagename.pm
。
#!/usr/bin/perl
use strict;
use warnings;
package packagename
#require Exporter;
#our @ISA=qw(Exporter);
#our @EXPORT=qw(subname1 subname2 subname3 $varname1 $varname2);
#our @version=1.0;
sub subname1 {
.....
}
1;
说明:
1. 下述四行代码使用的话,在use packagename之后,函数调用而已不用指明packagename,即subname1()
;
2. 否则,在use packagename之后,函数调用需要用指明packagename,即packagename::subname1()
;
#require Exporter;
#our @ISA=qw(Exporter);
#our @EXPORT=qw(subname1 subname2 subname3 $varname1 $varname2);
然后,加载模板的目录,使之成为库的目录。,假设packagename.pm
在/my/dir
目录里。
use lib '/my/dir';
脚本执行的关键信息保存在日志里
用open产生一个perl.log就挺方便。
Log::Log4perl
代码整理
perltidy命令。需要自行安装。帮助代码排版规范化。
参考文档:
《Perl高效编程》