[TOC]
快速入门 Perl 是 Practical Extraction and Report Language 的缩写”实用报表提取语言”是一种功能强大功能丰富的脚本编程语言,最初的设计者为拉里·沃尔(Larry Wall)诞生于20世纪80年代末期并由他不断更新和维护的编程语言。
其思想借用了C、sed、awk、shell脚本以及很多其他编程语言的特性,所以它的文本处理能力是及其强大的是关于Web处理中最常用使用的工具;
优点和特点:
Perl是高级、通用、直译式、动态、灵活的程序脚本语言(不需要编译器和链接器来运行代码)
Perl跨平台性 Dos/windows,MacOS,OS/2,VM2和Unix
Perl语言直接提供泛型变量、动态数组、Hash表等更加便捷的编程元素,提供了许多冗余语法。
Perl最重要的特性是Perl内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN可扩展性强
Perl提供了许多其他紧凑的数据处理结果(data-handling contructs),能够减少所需的”简单重复的劳动”,把更多的精力放在程序设计和正则表达式上;
Perl的mod_perl 的模块允许 Apache web 服务器使用 Perl 解释器。
_缺点_:
perl安装 描述:Perl的官网网站:http://www.perl.org/ ,目前Perl版本5.30.0;
weiyigeek.top-Perl
选择Unix中有两种版本:
Unix 和 Linux 安装 Perl:安装成功后Perl 的安装路径为/usr/local/bin,库安装在 /usr/local/lib/perlXX, XX 为版本号。
[TOC]
快速入门 Perl 是 Practical Extraction and Report Language 的缩写”实用报表提取语言”是一种功能强大功能丰富的脚本编程语言,最初的设计者为拉里·沃尔(Larry Wall)诞生于20世纪80年代末期并由他不断更新和维护的编程语言。
其思想借用了C、sed、awk、shell脚本以及很多其他编程语言的特性,所以它的文本处理能力是及其强大的是关于Web处理中最常用使用的工具;
优点和特点:
Perl是高级、通用、直译式、动态、灵活的程序脚本语言(不需要编译器和链接器来运行代码)
Perl跨平台性 Dos/windows,MacOS,OS/2,VM2和Unix
Perl语言直接提供泛型变量、动态数组、Hash表等更加便捷的编程元素,提供了许多冗余语法。
Perl最重要的特性是Perl内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN可扩展性强
Perl提供了许多其他紧凑的数据处理结果(data-handling contructs),能够减少所需的”简单重复的劳动”,把更多的精力放在程序设计和正则表达式上;
Perl的mod_perl 的模块允许 Apache web 服务器使用 Perl 解释器。
_缺点_:
perl安装 描述:Perl的官网网站:http://www.perl.org/ ,目前Perl版本5.30.0;
weiyigeek.top-Perl
选择Unix中有两种版本:
Unix 和 Linux 安装 Perl:安装成功后Perl 的安装路径为/usr/local/bin,库安装在 /usr/local/lib/perlXX, XX 为版本号。1 2 3 4 wget https://www.cpan.org/src/5.0/perl-5.30.0.tar.gz tar -xzf perl-5.30.0.tar.gz ./Configure -de make && make test && make install
weiyigeek.top-PerlInstall
接下来我们如果 perl -v 命令查看是否安装成功。1 2 perl -v This is perl 5, version 30, subversion 0 (v5.30.0) built for x86_64-linux
Perl语法基础 CMD语法:1 perl5.26.2 [switches] [--] [programfile] [arguments]
Perl参数:1 2 3 4 5 -e/E "Perl代码" -l -p -i -w/W
变量的声明使用与php相似都是采用$变量名称进行定义变量和调用变量;
1 2 3 4 5 6 7 8 9 10 perl -e "print 'This is a Demo'" This is a Demo perl -p -i -e 's/sysread/read/g' file.txt perl -w script.pl string.txt
特殊变量
$/ 特殊变量能使用一种神奇的方式,让<>不再返回单行文字,而是返回或多或少的一段文件。返回的数据任然是一个字符串,只是这个字符串可能包含多个逻辑行;
Perl数据类型:
注意事项:
Perl运算操作符:
赋值
判断
逻辑 (and / or / not)
位
其他操作符号
<> 每次读取一行数据相当于其他语言中的getline()函数.注意不要混淆操作符<>与shell的重定向符号>或者是Perl的大小于号;
1 2 3 4 5 while ($line = <>) { }
基础示例1:1 2 3 4 5 $celsius = 30;$fahrenheit = ($celsius * 9 / 5) + 32;print "$fahrenheit F, And $celsius ℃\n" ;
执行结果:1 2 perl demo1.pl 86 F, And 30 ℃
注意事项:
(1)Perl符号=~ / = 和 \=\= 之间的差别,等于 \=\=测试两个数字是否相等, = 用来给变量赋值,而=~用来连接正则表达式m/.../和待搜索的目标字符串
。
Perl控制结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 if (条件){ ... }else if (条件){ ... }else { ... } while (){ last ; }
Perl也提供与其他流行语言类似的控制结构:
基础示例2:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $num1 = 1024 ; $num2 = 1 ; $sum = 0 ; if ( $num1 != "" && $num2 != "" ){ $add = $num1 + $num2; print "$num1 + $num2 = $add\n" ; } while ($num <= 100 ){ $sum = $sum + $num; $num++; } print "1+..+3+...+7+100 = $sum \n" ;
执行结果:1 2 3 perl demo2.pl 1024 + 1 = 1025 1+..+3+...+7+100 = 5050
Perl正则表达式 描述:perl和Egrep属于同一个流派,Perl支持Regex的一些修饰符的使用并且Perl正则表达式中的元字符更多;1 2 3 4 5 6 7 8 9 $variable =~ m/regularExpression/i m s / /i /g /x /m
Perl提供例如许多简洁的元字符:
\cx 匹配由X指明的控制字符
\n : 换行符
\f : ASCII 进制符号
\t : tab键符号
\b : 退格键
\v : 垂直制表符
1 2 3 4 $ perl -E 'if("a\nb\tc" =~ m/\cI|\n/){print "匹配成功"}' 匹配成功 $ perl -E 'if("a\nbc" =~ m/\cI|\n/){print "匹配成功"}' 匹配成功
Perl支持捕获括号()
我们叫元组与非捕获类型括号(?:...)
表示只分组不补捕获;
注意事项:
在元组中子表达式的编号安装开括号的出现先后排序,从1开始子表达式可以嵌套例如(Washington(.DC)?)
如果只是希望分组,也可以使用()但副作用是他们捕获的文本任然会保存在特殊的变量之中;
3.Perl正则中的环视功能1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 (?=pattern) (?!=pattern) (?<=pattern) perl -l -e '$str="Windows2000 95Windows 2000Windows Windows95";if($str =~ s/Windows( ?<=95|98|NT|2000|10)/NOW/g){print "匹配成功 $str"}' (?<!pattern)
Perl多种方式使用正则表达式: 基础示例1:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 print "Please Enter a number(Eg:1024):" ;$demo = <STDIN>; chomp($demo ); if ($demo =~ m/^[0-9]+$/) { print "only digits\n" } else { print "not only digits\n" } $demo =~ m/^[-+]?[0-9]+(\.[0-9]*)?$/) printf "Please input 86 F or 30 C:" ;$value = <STDIN>;chomp($value ); if ($value =~ m/^([-+]?[0-9]+)([CF])$/){ $number = $1 ; $type = $2 ; if ($type eq "C" ){ $cel = $number ; $fah = ($cel * 9 / 5) + 32; } else { $fah = $number ; $cel = ($fah - 32) * 5 / 9; } printf "%2.f C And %.2f F\n" , $cel , $fah ; } else { print "Matching Error!" }
执行结果:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@master perl] Please Enter a number(Eg:1024):1024bac not only digits [root@master perl]$perl -w demo4.pl Please input 86 F or 30 C : 30C 30 C And 86.00 F [root@master perl]$perlperl -w demo4.pl Please input 86 F or 30 C : 86F 30 C And 86.00 F [root@master perl]$perl -w demo4.pl Please input 86 F or 30 C : 76F 24 C And 76.00 F
基础示例2:使用正则表达式修改文本 描述:Perl和其他许多语言提供的一个正则表达式特性:替换(substiution或者叫做查找和替换(search and replace))1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $string = "this is a demo" ; $string =~ s/is/test/gi ; print "$string" ;$string = "this is a demo" ; $string =~ s/\bis\b/test/i ; print "$string" ;$iee = 12.375000392 ; $iee =~ s/(\d+)(\.\d\d[1-9]?)\d*/$1$2/ ; print "$iee " ;$iee = 37.500000000925 ; $iee =~ s/(\d+)(\.\d\d[1-9]?)\d*/$1$2/ ; print "$iee " ;
执行结果:1 2 3 4 5 6 $ perl replace.pl thtest test a demo this test a demo 12.375 37.5
基础示例3:1 2 3 4 5 6 7 8 9 10 11 12 13 14 perl -l -e '$str="Window\047s 98";if($str =~ s/\47/\057/g){print "匹配成功 $str"}' 匹配成功 Window/s 98 $text =~ s { \b ( username \@ hostname ) \b }{<a href="mailto:$1 " >$1 </a>}gix
补充说明: 为什么有时候Perl在使用正则匹配的需要对$和@需要转义
$符号既可以作为字符串结束字符,又可以在Perl中作为标记变量;
@情况与之类似,Perl用@表示数组名,在Perl中的字符串或者正则表达式中也可以容许出现数组变量;如果需要使用@字符就需要进行转义避免把他作为数组名称;
perl内置函数 1 2 defined ($var); die "Error Exit!" ;
入坑解决 问题1.在编译perl源代码时候发生错误 1 2 3 4 5 6 perl: warning: Falling back to a fallback locale ("en_US.UTF-8" ) vim ~/.bashrc export LC_ALL=en_US.UTF-8. ~/.bashrc