perl学习笔记
目录:
1、pert的安装与示例
2、perl的一般框架
3、perl的变量(标量、数组、hash)
4、控制结构
5、自定义方法
6、perl的模式匹配
7、perl的文件读写
8、perl的数据库连接
一、perl的安装与一个简单示例
1、下载地址:https://www.activestate.com/products/perl/ 根据需要下载对应版本

windows直接点击下载安装即可
Linux下直接用命令下载安装
2、脚本示例
[root@VM-0-4-centos perl]# vi hello.pl #!/usr/bin/perl use strict; print 'hello world,i am perl!' [root@VM-0-4-centos perl]# perl hello.pl #运行程序 hello world,i am perl! [root@VM-0-4-centos perl]# perl hello.pl> hello.txt #运行并将结果输出到文件 [root@VM-0-4-centos perl]# ls hello.pl hello.txt [root@VM-0-4-centos perl]# cat hello.txt hello world,i am perl! [root@VM-0-4-centos perl]#
二、perl的一般框架
1、框架说明:程序头、变量定义、子程序、其他程序
#程序头部分 #!/usr/bin/perl #指出解释器perl的路径,只用于unix下,Windows下当注释处理 use strict; #相当于java的import,C的include #变量定义部分 my $a; #my是关键字,相当于declare,如果没有使用use strict;语句,则变量不用加my关键字,严格区分大小写 my @vb; my %c; #子程序部分 sub my_sub1{ ... return ..; } #remark sth sub my_sub2{ ... } #其他程序 others statemarns;
2、注释说明
1、单行注释(常用) #remark sth perl 2、块注释 =remarkbegin 这里=号定格写,后面紧跟以字母开头的字符串 statement1; statement2; =cut 这里标识注释结束 statement n;
3、子程序定义
没有main函数,自上而下执行
#sub定义时不需要指定参数及类型,如果调用的时候传递了参数,则所有的参数存在数组@_里面,$_[0],$_[1]...分别对应第1,2个参数 sub my_sub1{ } #sub的调用方式: &sub_name; sub_name()
三、perl的变量
标量 定义时用$表示; my $username="oracle" 数组 定义时用@表示; my @table=("custome","order"); Hash表 定义时用%表示; my %week=((1=>'monday'),(2=>'tuesday'))
1、标量
任意一个标量变量可以赋值整形、浮点型、字符型
变量名字由美元符号($)后接perl标识符。
由字母或下划线开头,厚街字母、数字、或者下划线。
变量区分大小写
变量赋值:q表示单引号,qq表示双引号
$test="hello"; $test=qq(hello); $test=7; $test=q(hello) 其中()可以换为<>。{},[]
字符串之间的拼接用“.”,如:$trs="test"."good"; java用+号,oracle用||号
[root@VM-0-4-centos perl]# cat hello.pl #!/usr/bin/perl #use strict; $str1="hello world!"; $str2=qq(i am perl!); print $str1." -- ".$str2."\n" [root@VM-0-4-centos perl]# perl hello.pl hello world! -- i am perl! [root@VM-0-4-centos perl]#
双引号与单引号的区别:双引号表达式中perl会对其中的变量先做解析替换,例如
my $passwd= "$username" 这样,$passwd实际上和变量$username的值相等。
如果想让passwd的值为$username,可以用单引号或者转义字符 my $passwd='$username'或my $passwd="\$username"
双引号中应用关键字,譬如$、@、#、\ 等需要使用转义处理,即使用“/”,单引号则不需要。
转义字符明细 \n 换行符 \r 回车 \t 水平制表符
\f 进纸(针对老式打印机来说) \b 退格 \a 警报(响铃) \e ESC字符
操作符:
+ - * / 加减乘除 %取模 ++ 递增 --递减 == != > < >= =< eq ne gt lt ge le ||逻辑或 &&逻辑与
相关函数:
length() 串的长度,返回位数
chop() 截取最后字符;
chomp() 截取换行符
#!/usr/bin/perl use strict; $str1="hello world!\n"; $str2=qq(i am perl!); print length($str1)."\n"; print "please input a string:\n"; my $v_in = <>;#读取控制台输入 chop($str1) chomp($v_in) print $v_in;
2、数组
一维数组,使用qw打印出来的没有逗号
my @arr1=(1,2,3,4,5,6,7); my @arr2=qw(1,2,3,4,5,7); my $length=@arr1; #将数组赋值给变量时,仅赋值数组的长度而不是值;将数组赋值给数组,则为完全复制数组 print $length,"\n"; print $arr1[5],"\n";#打印数组里第5个值 print @arr1,"\n";#打印数组里所有元素 1234567 print @arr2,"\n";#打印数组里所有元素 1,2,3,4,5,7 print "@arr1","\n";#打印数组里所有元素 1 2 3 4 5 6 7 print "@arr2";#打印数组里所有元素 1,2,3,4,5,7
多维数组
my @arr1=([1,2], [3,4], [5,6]); print $arr1[1][0]
#题目:将数组从后到前打印出来
my @arr1=(1,2,3,4,5,6,7); print @arr1[6,5,4,3,2,1,0] #7654321
数组相关函数
push:数组末尾添加值 pop:数组末尾删除值 shift:数组首部删除值 unshift:数组首部添加值
示例:
my @arr=(1,2,3,4,5,6,7); print "1:",@arr,"\n"; #1:1234567 push(@arr,6); #数组末尾添加值6 print "2:",@arr,"\n"; #2:12345676 pop(@arr); #删除数组末尾数值 print "3:",@arr,"\n";#3:1234567 pop(@arr); #删除数组末尾数值 print "4:",@arr,"\n";#4:123456 shift(@arr); print "5:",@arr,"\n";#5:23456 unshift(@arr,9); print "6:",@arr,"\n";#6:923456
#题目:将数组的第一个值改为11,第二个值改为77
#题目:将数组的第一个值改为11,第二个值改为77 my @arr=(1,2,3,4,5,6,7); shift(@arr);#首部删除1个数值 unshift(@arr,11); #首部添加11 pop(@arr); push(@arr,77); #末尾添加77 print @arr; #112345677
#join,reverse,map,split
my @arr=(1,2,3,4,5,65,97); print join("-",@arr),"\n";#1-2-3-4-5-65-97 print join("=",reverse@arr),"\n";#reverse倒置函数 97=65=5=4=3=2=1 #ascii码转换 my @map1 = map chr,@arr; print @map1,"\n";#Aa #算法应用 my @map2 = map $_*2,@arr;#翻2倍 print join(",",@map2);#2,4,6,8,10,130,194 my $a="a;b;c;d;e"; my $b=split(';',$a); print("\naa:","$b","\n");#aa:5 my @c=split(';',$a); print("dd:","@c\n");#dd:a b c d e
3、Hash数组
Hash定义(关联数组):%hash;
Hash的取值:%hash=("1"=>"first","2"=>"second") 或 $hash{"first"}="first"; $hash{"second"}="second"; print $hash{"1"}
my %hash=("1"=>"first","2"=>"second"); print %hash; print "\n\n"; while(($a,$b) = each %hash){ print "$a->$b\n"; print "$a \n"; print "$b \n"; } my @a=keys(%hash); my @b=values(%hash); print "\nkeys:@a\n"; print "values:@b\n"; my ($c,$d)= %hash; print "hash:$c\n"; print "hash:$d\n"; 输出: 1first2second 1->first 1 first 2->second 2 second keys:1 2 values:first second hash:1 hash:first
四、控制结构
if-elif-else语句
while循环
for循环
1、if判断
#!/usr/bin/perl use strict; my $x=5; if($x>1){print "------\n";} elsif($x<1){print "++++++\n";} else{print "======\n";}
案例
#!/usr/bin/perl use strict; my $a =10; print "please input a number :\n"; my $n = <STDIN>; if($n>$a){print "to hight !\n";} elsif($n<$a){print "to low !\n";} else{print "right!\n";}
2、while循环
#!/usr/bin/perl use strict; my $a =1; while($a<=3){ print "$a\n"; $a++; }
案例:跳出循环用last或exit
#!/usr/bin/perl use strict; my $a =10; my $cnt=0; while($cnt<=5){ my $cnt1=5-$cnt; print "please input a number and you will have only $cnt1 chances :\n"; my $n = <STDIN>; if($n>$a){ print "to hight !\n"; } elsif($n<$a){ print "to low !\n"; } else{ print "right!\n"; #last; exit(1) } }
3、for循环
#!/usr/bin/perl use strict; for($a=0;$a<10;$a=$a+1){ print "$a\n"; }
案例
#!/usr/bin/perl use strict; for($a=0;$a<200;$a++){ for($b=1;$b<200;$b++){ if($a * $b==240){ print "$a 乘 $b 等于 240\n" } } }
九九乘法表:?
五、perl的自定义方法
sub 函数名称{
statement1;
rereturn $c;
}
案例:
#!/usr/bin/perl use strict; sub func{ my($c,$d)=@_;#接收数组 return $c-$d; } print "pls input a number:\n"; my $a=<>; print "pls input another number:\n"; my $b=<>; #调用函数 my $c=func($a,$b); chomp($a); #去掉回车 chomp($b); print "$a - $b result is : $c \n";
sub定义时不需要指定参数及类型,如果调用时传递了参数,则所有的参数存放在数组@_里面,$[0],$[1]…分别对应第一、第二个参数。
调用方式:&sub_name;sub_name()
调用方法:perl hello.pl arg1 args
文件中用法:@ARGV $ARGV[0],$ARGV[1]……
常用写法:
if ($#ARGV<0){exit(1);}
六、perl的模式匹配
模式指在字符串中寻找特定的字符,由反斜线包含:/def/即模式def。类似linux的grep
Perl的模式匹配让你能够简便高效地搜索大量的数据
能在堆积成山的数据中扫描数据和抽取有用信息。
=~检验匹配成功 !~匹配不成功
#!/usr/bin/perl use strict; my $question="please help me!"; if($question=~/please/){ print("Thank you for being polite!\n") }else{ print("That was not very polite!\n") }
1、字符+
+意味着一或多个相同字符,例如:/de+f/ 可以匹配出def、deef、deeeef
它尽量匹配尽可能相同多的字符,例如:/ab+/ 如果有abb,尽可能匹配abb,而不是ab
2、字符[]和[^]
[]意味着匹配一组字符中的一个,例如:/a[0123456789]c/
与+联合使用,例如:/d[eE]+f/
^表示除其之外的所有字符,如:/d[^deE]f/
3、字符.*和?
"."匹配除换行外的所有字符,通常与*合用
与+类似,区别在于*匹配0个、1个或多个相同字符,?匹配0个或1个该字符。如:/de*f/;/de?f/
4、匹配任意字母或数字
/a[0123456789]c/匹配字母a加任意数字加c的字符串。另一种表示方法为/a[0-9]c/
/[a-z]/表示任意小写字母,/[A-Z]/表示任意大小字母
/[0-9a-zA-Z]/匹配任意大小写字母、数字
5、字符{}(指定数目)
{}指定所匹配字符的出现次数
/de{1,3}f/ 匹配def、deef、deeef
/de{3}f/ 匹配deeef
/de{3,}f/ 匹配不少于3个e在d和f之间
/de{0,3}f/ 匹配不多于3个e在d和f之间
6、字符|(指定选项,起到“或”的作用)
字符“|”指定两个或多个选择来匹配模式。例如:/def|ghi/
7、锚模式
^或\A 仅匹配串首(第一个字符必须是什么)
$或\Z 仅匹配串尾(最后一个字符必须是什么)
\b 匹配单词边界
\B 单词内部匹配
例如:
/^def/ 只匹配以def开头的字符串
/$def/ 只匹配以def结尾的字符串
结合起来的/^def$/只匹配字符串def
/\bdef/ 匹配def和defghi等以def开头的单词,但不匹配abcdef
/def\b/ 匹配def和abcdef等以def结尾的单词,但不匹配defghi
/\def\b/ 只匹配字符串def
/\Bdef/ 匹配abcdef等,但不匹配def (左边得有东西)
/def\B/ 匹配defghi等 (右边得有东西)
/Bdef\B/ 匹配cdefg、abcdefhi等,但不匹配def,defghi,abcdef (左右都必须有东西)
8、转义字符
\d 任意数字[0-9]
\D 除数字外的任意字符[^0-9]
\w \W 任意单词字符[_0-9a-zA-Z],任意非单词字符[^_0-9a-zA-Z]
\s 空白[ \r\t\n\f]
\S 非空白[^ \r\t\n\f]
例如:/[\da-z]/匹配任意数字或小写字母
案例:
#判断输入是否是手机号
#!/usr/bin/perl use strict; use warnings; print "Please input number:"; my $mobile=<>; #第1位必须是1,第2位必须是3/5/8,后面9位任意数字,$结尾,保证只有11位 if($mobile=~/[1][3,5,8][0-9]{9}$/){ print "Rihgt number!"; }else{ print "Wrong number!"; }
#判断输入是否是邮箱
#!/usr/bin/perl use strict; use warnings; print "Please input email address:"; my $email=<>; #结尾是@163.com,@qq.com,@126.com,@gmail.com等 if($email=~/[0-9a-zA-Z][\@][163.com|126.com|qq.com|gmail.com.cn]/){ print "Rihgt email address!"; }else{ print "Wrong email address!"; }
七、perl的文件读写
通过open函数实现对文件的读写
文件写操作;
open(INFILE,">D:/test.txt");#左反斜杠 >清空文件内容再写入
open(INFILE,">>D://test.txt"); #>>追加写入
print INFILE "1234567\n";
print INFILE "abcdefg\n"
close(INFILE);
写文件案例:
#!/usr/bin/perl use strict; open(INFILE,">D:/test.txt");#Windows是左右反斜杠均可,linux必须是左反斜杠 open(INFILE,">>D://test.txt"); print INFILE "1234567\n"; print INFILE "abcdefg\n"; close(INFILE);
读文件案例:通过while循环打印文本中内容,直到文件技术为止
#!/usr/bin/perl use strict; my $tmp; open(OUTFILE,"D:/test.txt"); while($tmp=<OUTFILE>){ print "$tmp"; } close(OUTFILE);
八、perl的数据库连接
1、环境准备
需要安装DBI、DBD::Oracle模块
1)删掉oracle/product/10.2.0/db_1目录下的perl文件
2)解析DBD、DBI两个压缩包,在DOS界面运行两个文件夹喜爱的makefile.pl
注:因为安装的是ActivePerl,所以集成了这两个包,故不用再下载安装
2、处理流程
建立数据库连接->建立会话->执行SQL语句->处理结果集->关闭数据库连接
3、案例
数据库连接:
#!/usr/bin/perl use strict; use DBI; my $tnsname="orcl"; my $username="scott"; my $password="tiger"; my $dbh=DBI->connect("dbi:Oracle:$tnsname,$username,$password") or die "Cannot connect db:$DBI::errstr\n"; if($dbh){ print "oracle数据库连接成功\n"; }else{ print "oracle数据库连接失败\n"; exit(1); } $dbh->disconnect;
打印数据:
#!/usr/bin/perl use strict; use DBI; my $tnsname="orcl"; my $username="scott"; my $password="tiger"; my $dbh=DBI->connect("dbi:Oracle:$tnsname,$username,$password") or die "Cannot connect db:$DBI::errstr\n"; #准备字符串 my $sql="select * from emp"; my $sth=$dbh->prepare($sql); #执行sql $sth->execute(); #打印数据 while(@row=$sth->fetchrow_array()){ print "row's @row \n" } $dbh->disconnect;
插入数据(insert/delete/update等):
#!/usr/bin/perl use strict; use DBI; my $tnsname="orcl"; my $username="scott"; my $password="tiger"; my $dbh=DBI->connect("dbi:Oracle:$tnsname,$username,$password") or die "Cannot connect db:$DBI::errstr\n"; #准备字符串 my $sql="insert into emp(empno,ename) values(999,'perl')"; my $sth=$dbh->prepare($sql); #执行sql $sth->execute(); $dbh->disconnect;

浙公网安备 33010602011771号