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;

 

posted @ 2023-10-06 23:42  航松先生  阅读(103)  评论(0)    收藏  举报