最近在写一个比较长的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,再重新运行。
Perl支持把你的pod格式文字块生成文档,这个pod格式文字块可以是植入在代码里的标记语言,也可以是单独的一个文件。
有了pod,只要在写脚本的时候,随手记下想法、说明,就不用再另外编写文档了,非常方便。
建议先仔细读一读perldoc perlpod里面的内容,文档详细介绍了pod标记语言的语法。
$ perldoc perlpod
尽量保证一个比较好的书写习惯,例如:
=pod
=head1 NAME
Water::Test – The great new Water::Test!
=head1 VERSION
Version 0.01
=cut
开始和结束都应该要空一行。当你用如上形式写到你的代码文件里后,你只要用pod2html, pod2man之类的命令,就可以把它转为文档。
例如,如果你把上面的代码保存为test.txt文件,则用如下命令可以把它转为html文档:
$ pod2html –infile test.txt –outfile text.html
如果你想用Perl读取一个目录下的所有文件名,你应该怎么办呢?一般来讲,我喜欢用两种方法。
第一种方法,直接用readdir来读取目录句柄。
use warnings;
use strict;my $dir = “./test”;
my $file;
my @dir;opendir (DIR, $dir) or die “can’t open the directory!”;
@dir = readdir DIR;
foreach $file (@dir) {
if ( $file =~ /[a-z]*\.zip/) {
print $file;
} else {
print “Not the kind of file type you want!\n”;
}
}
这段代码的含义就是:打开一个目录,读取所有的文件名,如果该文件名是以字母开头、并以.zip为后缀结尾的,则输出文件名称;否则,就输出提示消息。
当然,这段代码只会读取当前目录下的内容,并不会递归地寻找子目录下的内容。
第二种方法,直接用外部命令find。
在Unix Shell或是Cygwin里,有命令find可以直接读出目录下的文件名,而我们只要在Perl脚本里调用这个命令就可以了。
use warnings;
use strict;my $dir = “./test”;
my @file;
my $filename;@file = `find $dir -type f`;
foreach $filename (@file) {
print $filename;
}
上面的代码就直接调用外部命令find来进行查找与读取。这个时候,查找的结果,完全由你所调用的外部命令所控制。
两个方法都比较方便,第一种的移植性更强,推荐使用。
Perl Module是Perl语言最强大的功能,我们可以在CPAN上找到全世界Perl爱好者贡献的Module。但是,有的时候,我们自己也有代码需要可重复使用,能否把它们也做成Module,使它能方便的重复使用呢?
下面简单介绍一下Perl Module的创建方法,当然,更详细的信息,推荐仔细读一读官方的参考文档。
1) 先下载一个module-starter,并安装这个Perl Module。
以前很羡慕VC++里的那种补全模式,太强大了,打几个开头的字母,所有能补全的选项就出现在光标的地方。
在Emacs里也有强大的补全模式,它就是Complete Anything,简称为company-mode。
现在Company Mode已经是3.0版本了,配置非常简单:
1) 把官方网站下载下来的包扔到一个目录里,当然,最好是放在你的Emacs引导目录里,方便组织管理;
2) 在.emacs文件里加入如下的配置代码:
(add-to-list ‘load-path “/path/to/company”)
(autoload ‘company-mode “company” nil t)
3) 使用的时候,非常的简单,用命令M-x company-mode可以激活company补全模式,在你输入了几个字母后,Company会自动进行补全,用M-n和M-p命令可以进行上下选择。
如果要在Windows下写界面的话,有许多的C++界面库,例如VC++里自带的MFC库。但是,如果使用了这些库,当你要把你的界面程序移植到其它平台,那将是一件非常痛苦的过程。QT是一个非常优秀的C++界面库,跨平台、架构好、易使用。现在就简单介绍一下怎么在Windows下用MinGW和MSYS来编译QT程序。
2) 安装Qt
下载相应的安装文件,一路安装就OK了。安装完Qt后,在Windows系统的环境变量里添加Qt的路径,我这里是:
C:\Qt\4.4.3\bin
这样就可以在cmd里的任何位置使用Qt的命令了。
3) 把Hello World这段代码拷进去,Qt的帮助文件里有:
#include <QApplication>
#include <QPushButton>int main(int argc, char *argv[])
{
QApplication app(argc, argv);QPushButton hello(“Hello world!”);
hello.show();
return app.exec();
}
为方便编译,可以把这段代码的文件单独保存到一个文件夹里。
4) 用qmake来新建工程
qmake -project
qmake
在目标代码的文件夹里运行上面的两个命令,第一个命令会生成一个QTHello.pro的文件,第二个命令qmake会根据这个.pro文件来创建平台相关的makefile文件。
5) 在MSYS里跑make这个命令进行编译
如果编译顺利的话,就会在这个文件夹下面新建debug和release这两个子文件夹,里面放的是你make后生成的可执行文件。
TwitterFox是一个向你通报好友Twitter状况的Firefox扩展。
本扩展为你显示Twitter情况。它会在状态栏上添加一个小图标,来通报你朋友的Twitter更新。同时还有一个小输入栏让你可以更新自己的情况。
做得就像一个IM的客户端一样,很漂亮,很好用!
想想自己切换了Google的主帐号,却还没有把Google Bookmarks的数据迁移过来。于是今天开始动手折腾。
Google Bookmarks并不提供直接从一个Google帐号导入另一个Google帐号Bookmarks的功能。
因此,只能参考别人的方法用一用旁门左道了。
1) 先从Google Bookmarks里导出收藏夹,导出的文件为html格式;
2) 然后从Firefox里导入这个html格式的文件;
3) 在Firefox里安装Google Toolbar,然后在Google Toolbar里导入Firefox的书签。
真是万里长征,不知道为啥,Google Bookmarks里不提供一个直接导入书签的功能?