最近在写一个比较长的Perl脚本,用来自动化实现做task的流程与步骤。但是,其中有一些很容易出错的步骤,比如说我的VPN没有开、某某服务没启动等,就执行不了一些操作,从而导致脚本运行出错。

这个时候,我只好先修复配置错误,然后重新从头执行脚本。这样浪费了大量的时间,也弄得我很烦躁。工作原本就没太多乐趣,而我,哪里可能记得住这么多琐碎的事呢?

今天写了一个循环控制的东西,能在出错的步骤停止下来,等我修改了出错的步骤(系统环境而非代码本身),又能从中止的地方重新开始。示例代码如下:

use warnings;
use strict;

sub test1 {
print “test1\n”;
}

sub test2 {
print “test2\n”;
}

sub test3 {
print “test3\n”;

}

my $result = undef;

sub controller {
my $code_array = shift;
my ($code,$code_name) = @$code_array;
while (1) {
my $new_result = eval {&$code};
if ($@) {
print “$@ \n Someting is wrong when execute $code_name, please input ENTER when you fix it.”;
<>;
} else {
last;
}
}
}

my @codes = ([&test1,”test1″],[&test2,”test2″],[&test3,”test3″]);

map {controller($_)} @codes;

运行这段代码,会依次执行子函数test1,test2,test3等。

其中的eval语句,是必不可少的!有了eval后,如果子函数运行时出错或执行了die函数,就会返回一个undefined的值,并且错误消息也会存储到$@变量里;如果一切顺序,$@里就是一个空的字符串。有关这个用法,可以详细地看看perldoc里有关eval的说明

可以在test2或是其它子函数里插入一个die来试试中断的效果。

通过这样的结构,我就可以把很长的脚本分成若干个简短的子过程,大大地提高我的工作效率。另外要说明的是,代码本身的问题,并不能通过这样的方法来得到解决;还是得手动修改code,再重新运行。