语法
一.数据类型(Data type):
Perl 的数据类型大致分为四种:Scalar(变量)、Scalar Array(数组)、Hash Array(散列)、References(指针)1 Scalar(纯量变量):
# 纯量变数以$开头。
# my 是一种宣告变量的方式,它可以使变量区域化。 # 宣告变量时若不加 my 或 local 则Perl会把它当作全域变量使用。、my $x="abc"; #perl语言和C语言一样,末尾要加分号
my $x=123;
1-1 常用的操作运算符
1)、算术运算符 :加减乘除,幂(**),负(-)
2)、数字比较运算符
< > <= >= != ==
3).字符串比较运算符
lt(lower than=小于) gt(greater than=大于) eq,le(lower or equal=小于或者等于),ge(大于或者等于),ne(等于),
cmp(比较)
print($str1 cmp $str2); #print函数使用方法,需要加括号,后面要加分号
4)字符串的连接,重复
连接 ("."):a.b, $a = 'a'.'b'; print ($a.$b) or print ($a$b)
重复("x"): a x 4 =aaaa; x前后要有空格,后面是数字,代表重复几次
"love" x3 = lovelovelove
5)逻辑运算,位运算
9)、逗号(相当于:将两条语句写在一行)
适用范围: 只有当两个语句关联紧密时才使用 例如:$a+=1,$b=$a; => $a+=1; $b=$a; 例如:$a="ab5c", print $a."\n";2 ScalarArray(数组变量):
#用@开头,#var=(1,2,3);
#打印时候:print(@var,"\n")或者 print("@var\n");
#可以用省略号:@var=(1,2...5} = {1,2,3,4,5).(4.5..1.6)=() #因为他们之间没有显著的递增的关系,所以起始是无效数组,空数组
#数组赋值:@array = ($var1,$var2,$var3)
@array=<STDIN> ->由键盘输入,$var1 =<STDIN>
#数组长度获得: $var1 = @array -> var1中的结果是array的长度
@array=(1,2,3);
$scalar=@array;#$scalar=3,即@array的长度
($scalar)=@array;#$scalar=1,即@array第一个元素的值 ##这一条注意
perl中循环的写法: @array = (1,2,3...6); $count = 0; while($count <=@array){ print("element $count:@array[$count]\n"); $count +=1;}
#数组的子数组:subarray
@array =(1,2,3,4,5); @subarray = @array[0,2] -> @subarray = (1,2,3)
#数组中元素的交换:可以不用中介,直接进行
@array[0,1]=@array[3,4] ->@array = (4,5,3,4,5)
#数组中的一些函数:sort,chop,reverse,join,split
->sort:按照字符的大小排序
sort(@array),
@array = (80,100,2),sort(@array)=(100,2,80) ##注意不是按照数字的大小排序的。
->chop:将键盘输入时候末尾的字符(换行符)去掉,如果是用于数组,就每个元素的最后一个字符去掉
@array=("my","love","children"),chop(@array), @array = ("m","lov","childre")
->reverse:倒转字符串
->join:字符串连接 $string = join(" ","this","is","string")->用第一个位置的空格,连接后面的内容->$string = "this is string"
@list = ("word","like"), $sting =join(" ","this","am",@list) ->$sting = "this am word like"
->split:字符串劈分,劈分后应该得到数组 $sting = "this am word like", @array = split(/ /,$string)->@array = ("this","am","word","like")
3 Hash Array(哈希表):
->初始化:%h = {} , 或者 %h = (a=>1,b=>2) 或者 %h=('a'=>1,'b'=>2)
->取值: print(%h{a})--->打印出1, 删除值:delete(%h{a})
清空hash:undef %h 判断是否存在某key: exists($h{$key})
->遍历:@all_keys = keys %h; 如下,可以调整value的值的顺序,得到所有的key值
# 所有键值,是按hash的值从大往小排列的。值的比较是数字比较(比如说,10>9)
@all_keys = sort{$h{$b}<=>$h{$a}} (keys %h); # 所有键值,是按hash的值从小往大排列的。值的比较是数字比较 @all_keys = sort{$h{$a}<=>$h{$b}} (keys %h); # 所有键值,是按hash的值从小往大排列的。值的比较是字符串比较(比如说,'10' < '9') @all_keys = sort{$h{$a} cmp $h{$b}} (keys %h);
遍历一个hashwhile(my($k,$v) = each %h){ print("$k--->$v\n");}
4. 控制结构
if 。。。else
for循环的特殊形式 :foreach (@array)
next if ... 如果后面的条件满足,则跳过当前循环余下的东西,直接执行下一轮循环
last if ... 如果后面的条件满足,则退出整个循环
next if index <start;
last if index > end;
5.函数
#函数的定义:sub fun{ code }
#函数的调用:&fun(para1,para2)
#参数传递:@_[0] = 第一个参数 @_[1]=第二个参数,所有参数在@_中。
#使用参数:shift @_或者直接 shift,代表将参数的第一个值弹出
写一个函数,比较一组数中的最大值
my $maxvalue = &max(11,22,33);
print "maxvalue = $maxvalue\n";sub max{
my $currentMaxCnt = shift @_; #得到当前参数列表 foreach(@_){ if(currentMaxCnt <$_) { currentMaxCnt = $_; }}
6.输入与输出
#open(FH,"filename") --->
#open(FH,"+filename") -->打开文件,作为读的
#open(FH,">filename")---->打开文件,作为写的
#open(FH,"+>filename")--->打开文件,又读写
#open(FH,">>filename")--->打开文件,追加
#open(FH,"-")
#open(FH,">-")
#open(FILE,"filename") || die("can not open $filename:$!\n");
#close(FILE)
# $input = <STDIN>; chomp $input
7.常用函数
* pop, push, shift, unshift, reverse - list的操作函数
* keys,values, exists, each, delete - hash的操作函数 * chomp, split, join, index, substr, sort - 字符串操作函数 * sprintf,printf, print - 格式化输出函数 * system, exec, `` - 系统命令调用函数 * glob, unlink, mkdir, rmdir, rename,chmod,chown, open, close, opendir,closedir - 文件系统操作函数
* stat, lstat,localtime,gmtime,utime - 文档属性,时间相关函数 * hex, oct - 二进制,八进制,十六进制数转化成十进制的函数 * grep, map - list高级操作函数这些函数的详细介绍,都可以通过命令:
#perldoc -f functionname 查到常用库
* File::Basename - 根据path获取文件名或者文件路径 * File::Spec - 根据文件名与路径组合成全路经 * File::Find - 递归遍历某个目录下所有文件 * XML::Simple - 以一个复杂的结构来表示xml文件,使用起来相当方便 * Time::HiRes - 经常用来计算一个操作所耗费的时间 * Getopt::Long - 当脚本需要复杂的输入参数与选项时用到 * Cwd - 拿到当前工作目录 * IO::File - 文件操作
8.正则表达式
# =~ 或 !~的格式 ,后面跟的是要匹配的正则表达式
# m// --->匹配正则表达式 s//--->替换正则表达式 tr// -------->翻译正则表达式
# $true =($foo =~ m/foo/); -->如果$foo和后面的匹配,则true=1,否则是0
# my($hour,$minut,$second) = ($time =~ m/(\d+):(\d+):(\d+)/); --->用括号,可以取到匹配的内容,按照次序分配给前面的变量
# ?pattern? --->代表第一次匹配到的结果
@list = qw/food foosball subeo footnote terfoot canic footbrdige/; #用qw括起来的就是字符串数组foreach (@list){ $first = $1 if ?(foo.*)?; 如果是第一次匹配到,放到$1中,到first中 $last = $1 if /(foo.*)/;}print "First: $first, Last: $last\n";# by www.yiibai.comThis will produce following resultFirst: food, Last: footbrdige
#s/模式/替换成/ --->查找匹配模式的内容,替换为后面的结果
#$sting =~ s/cat/dog/; -->将cat替换为dog
#末尾可以加参数 o==只替换一次 g==全局替换
#tr/a/o/--->将字符串中的所有a替换为o tr/a-z/A-Z/--->所有小写换为大写