随心所欲

做个幸福的人
posts - 147, comments - 1402, trackbacks - 28, articles - 0
  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理

Perl的学习笔记

Posted on 2006-12-07 09:46 随心所欲 阅读(2905) 评论(12)  编辑 收藏 网摘 所属分类: 其他技术

 

1:使用背景。

   客户的机器是qnx系统,一个不常见的操作系统,还是一个v4.25的,版本很低。并且,几乎不能停机,也不能安装什么额外的东西。所以选用perl。还是底版本的perl5.002

   qnx是个实时操作系统,unix系列的一种,优秀的适合嵌入式应用的操作系统。新版本还有试用版,低版本的就只有商业版了。

2:学习环境:

我先使用的是Ubuntu操作系统来模拟Qnx系统。然后下载了一个最新版的perl来学习。最新版本perl5.8.8.x。运行环境:ActivePerl;开发环境 Dzsoft Perl Editor

Ubuntu是最近比较流行的linux系统。Perl环境也是5.8.8.x

ActivePerl:一个运行环境。提供了大量函数(类库)。有win版的,也有linux版本的。我从网上能找到5.005版的,for perl

Dzsoft Perl Editor:一个开发工具。可以调试,编辑,运行代码。简洁,实用。

3:语言特点

perl是一种自由且功能强大的编程语言。它被用作 Web 编程、数据库处理、XML 处理以及系统管理等等。可以用在绝大多数的unix系统之上。可以最底层的和nuix系统交互。

   Perl生于1987v5之后就稳定成熟起来。

   Perl"实用的摘要 和报告语言"的缩写字。感觉他非常底层。写最基本的输出语句(如果是web应用的话,和php非常相似);如果用来操作文件等,就非常和unix系统接近了(最初的目标也就是这里把);至于报表,没有用过,不知道怎么样。

   就像.net,他也有一个比较大的支持库。Active Perl就提供了不少。其他的网上也有的下。需要简单安装。我这次就下载了一个操作ini文件的类库:Config::IniFiles;

4:变量、基本语法

            几年前用过php,感觉perl的变量、语法和他真相(或者说是php学的它)。

    变量符号分几种:

      $ 字符串:比如$a=”tt”;  $_表示默认参数

      @ 数组:$a=@[0]. @_表示默认参数。

    变量范围

      $xx什么都不写,表示全局变量。整个文件中都可以访问到;

      local $xx 表示局部变量,但是这个值可以被其调用的子程序访问到

      my $xx 表示局部变量,只能在这一个函数里面可以使用,子程序就不能使用

    数据类型

      都存在一个单元里,可以自由变换。

      $len=@a;就成了取得长度;$a+$b;$a*$b都可以。

      这个特点很像php

    函数定义

      sub FunctionName

      {

         local ($a,$b)=@_;

         return “”; 

       }

       注意: 函数后便没有(),也没有参数列表定义。也就是说,他接受任何形式的参数,以数组的方式传递过来。所以内部使用的话,就用@_这个默认当前参数来取之。

       对了,perl里面语句也是用“;”来分开的。注释使用“#”。

    操控语句(语法)

       for, if , while 这几个都是php/c/c#这个系列类似的。也有特殊或者说是很灵活的用法,比如do untill,  do xxx if(statement);等。俺胆小,没敢用这么多语法在里面。

5:实用技巧

 取得命令行输入的参数

    $flag=@ARGV[0]; #get params of this app. 0 means close, 1 means run

    比方说,这样的启动运行命令 perl.exe main.pl 1”。

 异常处理

    没有提供基础的try catch

    有这样一个类似作用的语句可以实现类似的功能:

       eval
        {
           StatusReport();
        };
        if($@)
#ftp error . here is like try catch
        {
          Log(
"App Error [StatusReport]. [$@]",$appLog);
        }

     网上也由提供的类库,实现try catch. 不过,我觉得eval就已经挺好用了。

     至于抛出异常,用die()

       $ftp->put("$pathFrom/$fileName",$fileName) or die "put exception . $!";   #! the path need "//"
       

 调用外部类库(安装/部署)

    这个需要放在文件头上

    use Config::IniFiles;
use Net::FTP;

    至于该文件,就放在lib目录下的相应位置。比Config::IniFiles放在../lib/Config/IniFiles.pm

 类(模块)的使用

    就拿上一个Config::IniFiles做例子。、

my $cfg = new Config::IniFiles( -file => "$appPath/config.ini" );
这个实例化的方法看着还眼熟,其它也有好几个方法,不过看着别扭。

 Timer

    基本的用法里面,没有timer,虽然又提供的几个类,但还是用着很不爽。

    所以,到了最后,基本上就是使用while循环来代替了。While循环+sleep()函数来简单实现,用着还过得去。

 文件/目录 操作

    打开文件 open(FH, "$flagFile") or die "Couldn't open $flagFile for reading: $!"; 注意,用完了就要关闭它。 Close FH;
  
 写文件 print FH $flag;
   
读文件 @reads=<FH>; return @reads[0];

拷贝文件:copy(xx,xx)
    删除文件:unlink()

    创建文件:open(FH, "> $flagFile") 追加写打开。

    获得文件大小:-s $size=-s $file;

    获得文件时间:$mtime=(stat("$pathFrom/$fileName" ))[9];

    打开目录:opendir(DIR,$pathFrom); 注意,也要closedir
    读取目录: local @dots =  readdir(DIR);

for(@dots)

{$fileName=$_;#取得默认值}

    创建目录:mkdir("$failedPath/$taskName",0777);

    删除目录:rmdir($dir)

    判断是否是目录:if(!-d "$appPath/Log/$taskName")

 日期 操作

   sub DateFormat
{
  local @A =@_; 
#YYYYDDMMHHMMSS
  return sprintf(
"%04s%02s%02s%02s%02s%02s",$A[5]+1900,$A[4]+1,$A[3],$A[2],$A[1],$A[0]);
}
sub DiffDaysFromNow  
#span of days
 {
    local @A =@_;
    local @now=localtime(time());
    return (@now[
5]- $A[5])*360+($now[4]-$A[4])*30+(@now[3]-$A[3]);
  }

     时间格式取得的是unix格式的。所以要做一些转化:LocalTime($time)

     比方说,取得文件时间:

        my $mtime=(stat("$pathFrom/$fileName" ))[9];
    my $fileDate= DateFormat( localtime($mtime) ) ;

     取得当前时间   local @now=localtime(time());
 
另外一种时间就是格林威治时间。看起来没什么用,对我来说。

 字符串操作

    定义:使用”” 比如:$a=”ttt”; 如果是单引号,有其他的意思,好像是执行外部命令

    比较:eq ==

    连接:. 比方说 $a.Sb 。就相当于两个字符串连接了。也可以以这样$c=”$a$b”。一样可以解释出来。

    Indexindex($ftpURL,"@",0)

    Substrsubstr($ftpURL,index($ftpURL,"@",0)+1)

    Splitmy @list=split(",",$config);

    Replace:没找到。好像可以使用正则表达式来解决

 格式输出 sprint f("%04s%02s%02s%02s%02s%02s",$A[5]+1900,$A[4]+1,$A[3],$A[2],$A[1],$A[0]);

 数学计算

    +-*/

 多线程

   网上有提供的一个库。不是很稳定(安全)。

6:遗留问题

  文件目录处理(递归处理)

     因为取得目录需要定义一个dir句柄(opendir DIR),怎么在递归的程序里面重新定义一个新的dir变量呢?因为他们总是重名。

  执行外部命令并获得输出结果

     有几种方式:system(‘cmd’); exec(‘cmd’); $cmd=’cmd’

     但是每一种方式之后,界面上都有了输出结果,而我如何得到这个输出结果呢?重订向到一个文件?我尝试了这样的方法 $cmd=’cmd’;  if($cmd==“”)….. $cmd里面好像总是”cmd”字符串,没有执行的结果。

Feedback

#1楼    回复  引用    

2006-12-07 12:16 by 戏水[匿名] [未注册用户]
哈哈 据说比较适合放在 其他技术区

#2楼    回复  引用  查看    

2006-12-07 12:42 by 有容乃大      
跟.net有什么关系。

#3楼 [楼主]   回复  引用  查看    

2006-12-07 13:47 by 随心所欲      
怎么说呢?我一直在用.net,但实现的需求让你不得不用些其他语言来辅助开发。

#4楼 [楼主]   回复  引用  查看    

2006-12-07 13:54 by 随心所欲      
书到用时方恨少。为了一个大case,你就得暂时用一种全新的语言来做开发。了解一点没坏处。

#5楼    回复  引用    

2006-12-07 14:13 by Victor[匿名] [未注册用户]
喵了一眼,变量范围部分不对。

local变量你可以认为是从创建块内执行到创建块结束有效。
my变量是词法变量,可以认为是对当前块内的东西有效。 如果没有花括号括起来的当前块,就是本文件内有效。

对当前块内的东西有效的说法便于你理解闭包
http://www.iaskgoogle.com/search.php?q=perl+%B1%D5%B0%FC&btnS=IaskGoogle%CB%D1%CB%F7&layout=all

扫目录用File::Find。 不过如果不需要特别的灵活性可以在shell里面扫,在小数据量的情况下这样更有效。
find path -xxxxx| grep xxx | grep -v xxx | your_perl_script
find path -xxxxx| grep xxx | grep -v xxx | xargs your_perl_script


“ ’ ” 字符错了。 应该用 “ ` ” 就是你esc键附近,和~在一起的那个键。

#6楼    回复  引用    

2006-12-07 14:25 by Xpc [未注册用户]
俺也初学

执行外部命令并获得输出结果
要这样用
$cmd=`cmd`;

注意思,这两个不是单引号,而是键盘左上角,与“~”号一起那个键,这样可以得到输出

#7楼    回复  引用    

2006-12-07 14:26 by Xpc [未注册用户]
不会吧,俺刚想说,楼上的就说了,早了十三秒提交

#8楼 [楼主]   回复  引用  查看    

2006-12-07 14:40 by 随心所欲      
@Victor[匿名]
非常感谢。
Perl我用的时间比较短,有些理解不到位。谢谢指正。
另外,对于’’和``,还真是没有注意到。从网上搜索的,copy下来之后也是’了,难怪我这边总是出错了。

#9楼 [楼主]   回复  引用  查看    

2006-12-07 14:41 by 随心所欲      
@Xpc
哈哈,都是高手。
同样感谢。

#10楼    回复  引用  查看    

2006-12-08 09:53 by Icebird      
学过一阵perl,但是没机会用,又给生疏了

#11楼 [楼主]   回复  引用  查看    

2006-12-08 10:05 by 随心所欲      
@Icebird
我也学习过vc++,用了最多的时间。但是后来一直没用,也是生疏了(其实是荒废了^_^)。
学以致用,不用的话,就忘记了。所以俺要记下来。

#12楼    回复  引用    

2007-01-10 18:06 by netx [未注册用户]
Perl看起来感觉就不爽,个人更喜欢 PHP
PHP基本拥有Perl的全部功能,用来做web开发是个不错的选择




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: