Posted on 28-04-2009
Filed Under (技术) by waterlin

最近在写一个比较长的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,再重新运行。

(0) Comments    Read More   
Posted on 23-04-2009
Filed Under (技术) by waterlin

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

(0) Comments    Read More   
Posted on 21-04-2009
Filed Under (技术) by waterlin

如果你想用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来进行查找与读取。这个时候,查找的结果,完全由你所调用的外部命令所控制。

两个方法都比较方便,第一种的移植性更强,推荐使用。

(0) Comments    Read More   
Posted on 20-04-2009
Filed Under (技术) by waterlin

Perl Module是Perl语言最强大的功能,我们可以在CPAN上找到全世界Perl爱好者贡献的Module。但是,有的时候,我们自己也有代码需要可重复使用,能否把它们也做成Module,使它能方便的重复使用呢?

下面简单介绍一下Perl Module的创建方法,当然,更详细的信息,推荐仔细读一读官方的参考文档

1) 先下载一个module-starter,并安装这个Perl Module。

这个

Posted on 14-04-2009
Filed Under (技术) by waterlin

以前很羡慕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-nM-p命令可以进行上下选择。

(1) Comment    Read More   
Posted on 07-04-2009
Filed Under (技术) by waterlin

如果要在 Windows 下写界面的话,有许多的 C++ 界面库,例如 VC++ 里自带的 MFC 库。但是,如果使用了这些库,当你要把你的界面程序移植到其它平台,那将是一件非常痛苦的过程。QT 是一个非常优秀的 C++ 界面库,跨平台、架构好、易使用。现在就简单介绍一下怎么在 Windows 下用 MinGW 和 MSYS 来编译 QT 程序。

1) 安装 MinGW 和 MSYS

具体如何安装 MinGW 和 MSYS,可以参见 Windows 下 MinGW 的安装与使用MSYS的使用与界面配置这两篇文章。

2) 安装 Qt 库

下载相应的安装文件,一路安装就 OK 了。安装完 Qt 后,在 Windows 系统的环境变量里添加 Qt 的路径,我这里是:

这样就可以在 cmd 里的任何位置使用 Qt 的命令了。

3) 把 Hello World 这段代码拷进去,Qt 的帮助文件里有:


为方便编译,可以把这段代码的文件单独保存到一个文件夹里。

4) 用 qmake 来新建工程


在目标代码的文件夹里运行上面的两个命令,第一个命令会生成一个 QTHello.pro 的文件,第二个命令 qmake 会根据这个 .pro 文件来创建平台相关的 makefile 文件。

5) 在 MSYS 里跑 make 这个命令进行编译

如果编译顺利的话,就会在这个文件夹下面新建 debug 和 release 这两个子文件夹,里面放的是你 make 后生成的可执行文件。

(1) Comment    Read More   
Posted on 03-04-2009
Filed Under (软件) by waterlin

TwitterFox是一个向你通报好友Twitter状况的Firefox扩展

本扩展为你显示Twitter情况。它会在状态栏上添加一个小图标,来通报你朋友的Twitter更新。同时还有一个小输入栏让你可以更新自己的情况。

做得就像一个IM的客户端一样,很漂亮,很好用!

(0) Comments    Read More   

想想自己切换了Google的主帐号,却还没有把Google Bookmarks的数据迁移过来。于是今天开始动手折腾。

Google Bookmarks并不提供直接从一个Google帐号导入另一个Google帐号Bookmarks的功能。

因此,只能参考别人的方法用一用旁门左道了。

1) 先从Google Bookmarks里导出收藏夹,导出的文件为html格式;

2) 然后从Firefox里导入这个html格式的文件;

3) 在Firefox里安装Google Toolbar,然后在Google Toolbar里导入Firefox的书签。

真是万里长征,不知道为啥,Google Bookmarks里不提供一个直接导入书签的功能?

(0) Comments    Read More