Perl是一门功能强大的脚本语言,诞生于20世纪80年代,Perl关于文本处理和正则表达式的许多概念来自两种专业化的语言:awk和sed。
Perl可以应用于很多平台,包括windows,linux,mac os,Dos。
例1:
摄氏度和华氏度的转换,脚本如下:
[root@localhost Fuck]# cat temperature.pl
#!/usr/bin/perl
$celsius = 30;
$fahrenheit = ($celsius * 9 / 5) +32;
print "$celsius C is $fahrenheit F.\n";
给temperature.pl加上执行权限之后,直接./temperature.pl就可以执行了,也可以使用 perl temperature.pl, \n表示换行。
P.S:perl,python,shell脚本开头必须指定语言,如#!/usr/bin/perl , #!/usr/bin/python , #!/bin/bash ,脚本名称的结尾不一定非得用pl , py , sh,这些都是为了区分脚本类型方便命名的。
Perl也提供跟其他流行语言类似的控制结构:
[root@localhost Fuck]# cat temperature-while.pl
#!/usr/bin/perl
$celsius = 20;
while ($celsius <= 45)
{
$fahrenheit = ($celsius * 9 /5) + 32;
print "$celsius C is $fahrenheit F.\n";
$celsius = $celsius + 5;
}
在条件为真(即$celsius<=45)时,while循环控制的部分会重复执行。加上执行权限后,执行的结果如下:
[root@localhost Fuck]# ./temperature-while.pl
20 C is 68 F.
25 C is 77 F.
30 C is 86 F.
35 C is 95 F.
40 C is 104 F.
45 C is 113 F.
也可以使用 perl -w temperature-while.pl 来运行这个脚本,-w会告诉Perl,仔细检查程序,在Perl认为可疑的地方发出警报。
使用正则表达式匹配文本
if ($reply =~ m/^[0-9]+$/) {
print "only digits\n";
} else {
print "not only digits\n";
}
m代表尝试进行正则表达式匹配, =~ 用来连接 m/.../和想要搜索的字符串,即 $reply。
=~ 用来连接正则表达式和想要搜索的字符串。
== 用来测试两个数值是否相等。
eq 用来测试两个字符串是否相等。
= 给变量赋值。
例子:
[root@localhost Fuck]# cat temperature1.pl
#!/usr/bin/perl
print "Enter a temperature in Celsius:\n";
$celsius=;
if ($celsius=~m/^[0-9]+$/)
{
$fahrenheit=($celsius*9/5)+32;
print "$celsius C is $fahrenheit F\n";
}
else
{
print "Expecting a number,so i don`t understand \"$celsius\".\n";
}
执行完结果如下
[root@localhost Fuck]# ./temperature1.pl
Enter a temperature in Celsius:
20
20
C is 68 F
[root@localhost Fuck]# ./temperature1.pl
Enter a temperature in Celsius:
aaaaa
Expecting a number,so i don`t understand "aaaaa
".
但是这个脚本不能处理Celsius为负数和小数,所以如下:
($celsius=~m/^[-+]?[0-9]+(\.[0-9]*)?$/)
这样就完整了。
成功匹配的副作用
$! $2用来代表正则表达式括号包含的部分。与第一章的 \1 \2功能类似。
错综复杂的正则表达式
\t 代表制表符,相当于tab
\n 代表换行符。
\b 退格符
非捕获型括号 (?:...)
在上面的例子中,我们用括号包围了 (\.[0-9]*)? 来进行分组作为$2,而我们并不会使用$2,它只是一个小数部分,如果有一种括号只分组而不影响文本的捕获问题就好办了,Perl提供了这种功能,如下:
(....) 分组且捕获
(?:...) 只分组不捕获
if ($input =~ m/^([-+]?[0-9]+(?:\.[0-9]*)?)([CF])$/)
这样的话
(?:\.[0-9]*) 是第二组,但是不是$2 , ([CF])才是$2。
(?:...)好处如下:
避免不必要的捕获操作,提高了捕获效率;根据情况选择合适的括号能够让程序更清晰。
用 \s 匹配所有”空白“
\t 代表制表符。
\s 代表所有表示空白字符的字符组,包括空格,制表符,换行符和回车符。
\s* 表示很多空格。
在温度转换的例子中,CF也可以由cf小写出现,使用 i 修饰符解决,如下:
$input =~ m/^([-+]?[0-9]+(\.[0-9]*)?)\s*([CF])$/i
i 告诉正则表达式不进行大小写区别。
暂停片刻
i 表示不区分大小写,一般放在 m/正则/i
(?:...) 非捕获型括号
匹配成功后,Perl可以使用 $1 $2来表示括号内的子表达式。
使用正则表达式修改文本
以上的正则表达式都是提取文本,接下来的内容讲正则表达式 ”替换 “文本。
$var =~ s/regex/replacement/
$var =~ s/regex/replacement/i i 表示regex不在乎大小写
$var =~ s/\bregex\b/replacement/ \b单词分界符
例子:公函生成程序
$var =~ s/regex/replacement/g g 全局替换,对所有字符串都替换。
自动编辑操作
perl -p -i -e 's/sysread/read/g' file
-e 表示整个程序接在命令的后面,在正则表达式之前。
-p 表示对目标文件的每一行进行查找和替换。
-i 表示将替换的结果写回到文件。
处理邮件的小工具
.* 表示一组任何字符。
用环视功能为数值添加逗号
有的数值有逗号就比较容易识别,例如
print "The US population is $pop\n";
298,444,215
用环视就能很好的给数字加上逗号。
P.S
(?:...) 分组但不捕获
(?=...) 顺序环视,意即在此位置的右边。
(?<=...) 逆序环视,意即在此位置的左边。
(?! ) 否定顺序环视,意即右边不是。。。
(?
PS:
环视功能在Perl中很少使用。
Text-to-HTML转换
好难哇。。。