perl编写之前的一些习惯细节

下述信息,仅供自己编写新脚本之前的回顾内容。编写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模块

主体结构的划分

  • 主程序划分为多个子程序
    1. 子程序的参数传递,尽量用散列来吸收;不要定义太多变量。这样方便理解,更方便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高效编程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值