2008年5月17日星期六

《Perl语言入门》是本好书

出于调试一个C实现的一个简单遗传算法的参数的需要,写了一个简单的perl脚本,后来发现perl很好用,于是索性把另外一个算法的预处理从java程序里拿出来,交给perl来做了。

同寝室的一个哥们在诺基亚实习,他说他们也要用perl来处理日常工作,并向我推荐了《Perl语言入门》。我正在边用边读,发现确实是一本好书。

下面列一些我用到的函数,作为备忘吧。

  3 sub stat{
  4
  5         $sum = 0;
  6         $min = @_[0];
  7         $max = @_[0];
  8         $n = scalar(@_);
  9         $var = 0;
 10         foreach(@_){
 11                 $sum += $_;
 12
 13                 if($_ < $min){
 14                         $min = $_;
 15                 }
 16                 elsif($_ > $max){
 17                         $max = $_;
 18                 }
 19         }
 20         $avg = $sum / $n;
 21         foreach(@_){
 22                 $var += abs($_ - $avg);
 23         }
 24         return ($min, $avg, $max, $var / $n);
 25 }

这个函数用来计算一个非空数组的一些统计量。要算方差的话需要用到乘幂运算符
2**10 == 1024

--
$mutation = 0.1 + (int rand(9))/10;
随机数生成

--
use Time::HiRes qw(usleep ualarm gettimeofday tv_interval);
$toc = gettimeofday();
计时,浮点数做差

--
 -e $G_TWReaderExe or die
确认文件存在

--
 opendir DH, $G_datapath or die "data path not fount:$!";
 foreach $f (readdir DH)
next if $f =~ /^\./;
打开并遍历目录,过滤..路径,别忘了 close DH;

--
open F, "$G_TWReaderExe $G_datapath/$f/page.dat|" or die
打开进程的标准输出作为文件句柄
 while(<F>){
                 chomp;
                 $count_line++;
                 &deal($converter->convert($_));
         }
然后逐行遍历输出流

--
其中用到字符集转换
use Text::Iconv;
 $converter = Text::Iconv->new("gb2312","utf8");


调用自定义函数(perl的古老概念子过程sub)需要加&才好。