变量、基本语法
几年前用过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。
有这样一个类似作用的语句可以实现类似的功能:
{
StatusReport();
};
if($@)#ftp error . here is like try catch
{
Log("App Error [StatusReport]. [$@]",$appLog);
}
网上也由提供的类库,实现try catch. 不过,我觉得就已经挺好用了。
至于抛出异常,用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”字符串,没有执行的结果。
0 0 0