想必学习perl的人,对基础正则表达式都已经熟悉,所以学习perl正则会很轻松。这里我不打算解释基础正则的内容,而是直接介绍基础正则中不具备的但perl支持的功能。关于基础正则表达式的内容,可参阅基础正则表达式。
我第一个要说明的是,perl如何使用正则。还记得当初把《精通正则表达式》的书看了一遍,把perl正则也学了个七七八八,但是学完后却不知道怎么去使用perl正则,虽然里面也介绍了一点如何使用perl语言,grep的"-P"选项使用的也是perl正则,ack工具支持的也完全是perl正则,但都没有完整地体现perl正则的功能,总感觉缺点啥。最大的无奈莫过于此了,学了知识,却不知道怎么完整地应用。所以,我把如何使用perl正则来匹配数据放在最开头介绍,包括匹配指定字符串、匹配变量、匹配标准输入(如管道传递的数据)以及匹配文件中的每一行数据,而且后文我假设各位和我当初一样,完全没有perl语言基础,所以我会介绍一些perl语言和后文相关的语法,确保全文学习过程没有任何阻塞。
另外,本系列只介绍匹配操作,关于内容替换,因为和学习使用perl正则并无多大关系,所以替换相关的将在下一篇文章单独解释。
这里推荐一个学正则非常好的资料:stackflow上关于各种语言(perl/Python/.net/Java/ruby等等)的正则的解释、示例,这里收集的都是对问题解释的非常清晰且非常经典的回答。在我学习perl正则的时候,对有些功能实在理解不了(想必你也一定会),就会从这里找答案,而它,也从来没让我失望:https://stackoverflow.com/questions/22937618/reference-what-does-this-regex-mean/22944075#22944075
以下是perl正则的man文档:
perl正则快速入门:man perlrequick
perl正则教程:man perlretut
perl正则完整文档:man perlre
学perl正则必备的一点基本语法新建一个文件作为perl脚本文件,在其首行写上#!/usr/bin/perl,它表示用perl作为本文件的解释器。写入一些perl程序后,再赋予执行权限就可以执行了,或者直接使用perl命令去调用这个脚本文件,前面的两个过程都可以省略,这和shell脚本的方式是完全一样的,无非是将bash替换为了perl,想必各位都理解。
1.print用来输出信息,相当于shell中的echo命令,但需要手动输入换行符"\n"进行换行。
例如:
#!/usr/bin/perl print "hello world\n"; # 注意每一句后面都使用分号结尾保存后,执行它(假设脚本文件名为test.pl):
$ chmod +x test.pl $ perl test.pl2.变量赋值
perl中的变量可以不用事先声明,可以直接赋值甚至直接引用。注意变量名前面总是需要加上$符号,无论是赋值的时候还是引用的时候,这和其它语言不太一样。
#!/usr/bin/perl $name="longshuai"; $age=18; print "$name $age \n";3.if语句用来判断,语法格式为:
if(condition){ body }else{ body }例如:
$age = 18; if($age <= 20){ print "age less than 20\n"; } else { print "age greate than 20\n"; }4.默认参数变量
在perl中,对于需要参数的函数或表达式,但却没有给参数,这是将会使用perl的默认参数变量$_。
例如,下面的print本来是需要参数的,但是因为没有给参数,print将输出默认的参数变量$_,也就是输出"abcde"。
$_="abcde"; print ;perl中使用$_的地方非常多,后文还会出现,不过用到的时候我会解释。
5.读取标准输入
perl中使用一对尖括号格式的<STDIN>来读取来自非文件的标准输入,例如来自管道的数据,来自输入重定向的数据或者来自键盘的输入。需要注意的是,<STDIN>读取的输入会自带换行符,所以print输出的时候不要加上额外的换行符。
例如,在test.pl文件中写入如下内容:
#!/usr/bin/perl $data=<STDIN>; print "$data";然后用管道传递一行数据给perl程序:
echo "abcdefg" | perl test.pl