设为首页 收藏本站
查看: 1799|回复: 0

[经验分享] Perl的学习笔记

[复制链接]

尚未签到

发表于 2015-12-25 14:15:22 | 显示全部楼层 |阅读模式

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生于1987,v5之后就稳定成熟起来。
   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”。一样可以解释出来。
    Index:index($ftpURL,"@",0)
    Substr:substr($ftpURL,index($ftpURL,"@",0)+1)
    Split:my @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”字符串,没有执行的结果。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156233-1-1.html 上篇帖子: [原]perl使用LWP模块写的翻译小程序 下篇帖子: [转移]安装 BugZilla 时 Perl 模块的安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表