Perl Tips

Perl Tips

1. 运行问题

众所周知,在Perl文件的头上写上 #!/usr/bin/perl,然后把Perl文件加上可执行属性(chmod +x myprog.pl),之后在Linux上就可以直接运行perl文件了(如果当前路径未设置还得使用./ myprog.pl这样的方式)。

结果我和某同事的机器上这样做了以后都不行,系统说找不到command。最开始还以为是Perl的安装配置问题,后来别人都说不需要特别设置。好在还可以用perl myprog.pl这样的方式运行,就先凑合着用。突然发现原来如此:我们都是在Windows上写Perl文件,然后ftp传到Linux工作站上,再然后用Reflection通过XDMCP连到工作站上运行(有点BT啊,汗)。Windows的换行都是回车(\r)换行(\n)两个字符;而 Linux只有一个换行。由于/usr/bin/perl后面多了个回车,系统就找不到命令了。解决方法倒也简单,KDE里面有个编辑工具叫 kwrite,用kwrite打开一下源代码文件再存盘就可以――kwrite会自动把回车换行转换成换行。

kwrite还有一个特性:一个UNIX格式的文本文件,如果末尾一行的行尾没有换行符号,在关闭该文件时kwrite并不会做什么。但如果在这个文本文件里做任何改动,例如增加或者删除一个空格,再存盘,kwrite会在在你做的修改之外,再在文末加一个换行!--kwrite是很好的工具,能自动识别perl, C, Java等语言的语法,但是千万不要用它打开二进制文件啊。

2. 一些目录相关操作

2.1 遍历一个目录,寻找匹配的文件名
这里寻找/home/tmp/下大于1K, 后缀为bin的文件。

$path = "/home/tmp/";
opendir(DIR, $path);
@array = readdir(DIR);
@files = grep{!-d “$path$_”} @array; #过滤掉目录,只剩文件
@smallfiles = grep{-s “$path$_” > 1024} @files; #大于1K

foreach $filename (@smallfiles)
{
$filename =~ /*.\.bin/i;
}

注意上面用$path$_重建了绝对路径文件名。使用grep仅适用于Linux/Unix平台,需要跨平台的代码需要使用File:Find模块。顺便说,opendir和readdir的用法也可以这样,体现了Perl”条条大道通罗马”的原则。

opendir(DIR, $path);
@array = readdir(DIR);

2.2 切换目录
在Perl里面切换目录,执行系统命令cd是没有效果的。必须使用chdir($pathname)。

3. 调用系统命令的方法
方法一:system(”$sCmd”); 最好不要在命令里使用字符运算,把命令存到字符串里是比较好的做法。
方法二:@result = `$sCmd`; 就是用两个`符号把命令包起来。执行的结果会存到@result里。

4. 一个Perl新手易犯的错误
如果一个Perl新手写过C代码,他往往会条件反射地在写一个函数时这样写:

sub FuncA()
{
my ($url) = @_;
}
FuncA();

这个写法在v5.8.0上是可以正常编译运行的。如果现在要增加一个参数呢?

sub FuncB()
{
my ($name, $url) = @_;
}
FuncB(”Mach”, “http:\/\/mach.debagua.com”);

Perl会报告说FuncB使用了太多的参数。去查手册也是得不到多少信息的,问题出在FuncB的函数体定义FuncB()中括号上。Perl的语法是没有括号的,但是编译器会忽略这个括号。在只有一个参数的时候还能正常工作,但在有两个或者两个以上参数时就报错了。解决办法:函数名后面不要有括号。

Posted: July 10, 2006 Comments (0)