4.3 Perl编程语言介绍

六月 26, 2015 Perl, 生物信息 por DeanGao

pay

写在最前面:

本节将详细地讲解如何去掌握生物信息学分析中一门常用的编程语言——perl,并结合相应的例子来强化perl编程学习。对于没有计算机编程知识的人来说,学习一门编程语言的过程是痛苦并漫长的,尤其是对学生物的人,

1. 为什么要学编程?
2. 为什么选择perl?
3. Perl编程语言简介
4. Perl基础知识详解

5. 小结


1. 为什么要学编程?

  • 生物信息中的有些操作是不能通过简单的Linux命令来完成的,需要一些复杂的逻辑。Linux常用命令只是基础,功能单一,更高级的编程能满足多样化的需求,将处理流程简化。
  • 在生物信息学中好的编程能力也是实现算法及开发实用工具的基础。

2. 为什么选择perl?

  • 在生物信息学的应用及开发领域中,设计到的编程语言有C/C++、Perl、Python、Java、R、web开发等,各自有各自的特点,各有各的最佳使用范围。
  • 在应用生物信息学分析数据过程中(即不开发工具),Perl、Python、R这些脚本语言更加适合,相比之下R比较关注与统计等方向,Perl、Python比较关注于数据流的处理,其中Python除了在生物信息学中有广泛的应用之外还有其他更加广泛的应用领域,Perl则少些。
  • 但是如果仅是处理生物信息学中的一些问题的话,Perl与Python并无太大区别,完全可以胜任
  • 与实验室一开始就使用Perl的体系相关。

3. Perl编程语言简介

  • Perl是Practical Extraction and Report Language的缩写,它是由Larry Wall设计的,并由他不断更新和维护,用于在UNIX环境下编程。
  • Perl具有高级语言(如C)的强大能力和灵活性。事实上,你将看到,它的许多特性是从C语言中借用来的。
  • 与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl来运行而已。这意味着Perl对于小的编程问题的快速解决方案和为大型事件创建原型来测试潜在的解决方案是十分理想的。
  • Perl提供脚本语言(如sed和awk)的所有功能,还具有它们所不具备的很多功能。简而言之,Perl象C一样强大,象awk、sed等脚本描述语言一样方便,擅长处理文本数据有众多模块可用

4. Perl基础知识详解

章节内容大部分来自flamephoenixPerl中文手册,(http://man.ddvip.com/web/perl/perl1.htm),转载请注明出处,尊重原创作者。

4.1 Perl编程基础知识

  • 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到相应结果的过程。
  • 为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。
  • 编程语言俗称“计算机语言”,种类非常的多,总的来说可以分成机器语言汇编语言高级语言三大类。
  • 高级语言是人类易懂的语言。
  • 每种编程语言都有一定的语法。

 

  • Perl 是Linux发行版中自带的(可能不是最新版本),通常位于

/usr/local/bin/perl 或 /usr/bin/perl中,也可以自己重新安装(这里不推荐大家重新安装):

(1)解压:
$tar -zxvf perl-xxx.tar.gz
(2)配置:
$./configure
(3)编译:
$make
$make test
$make install

  • Windows 操作系统中是不带有Perl的,推荐安装ActiveState Perl等发行版本(具有较好的模块管理系统)。
  • Perl的脚本具有跨平台特性(即可以在不同操作系统上运行)。
  • Perl相关命令:

perl—— 运行perl脚本、perl命令行

perldoc——perl文档帮助系统


4.2 Perl脚本文件内容结构

下面是一个典型的简单的perl脚本文件。

1

 

文件内容结构解释:

  • helloword.pl 文件名及后缀(后缀名称不重要)。
  • #!/usr/bin/perl –w 以#!开头为第一行,表示调用/usr/bin/perl,并附带-w(warnings)参数来解释下面的编程语句。
  • #============  #后面的内容为注释(描述)信息,perl不予执行。
  • use strict; 调用strict模块。 以;结束该语句(这也是一般编程语言所遵循的准则,也有些不是,比如R和Python等)。
  • my $onevar = “Hello World!!!\n”;  定义一个字符串变量并赋值,my为变量作用域限制(后续会讲到)。
  • print($onevar); 打印该变量内容到屏幕上, 以;结束该语句。

执行Perl脚本文件:

  • 一种执行方式是:

$ perl   [脚步所在路径] [参数]

  • 另一种执行方式是:

$ chmod u+x [脚本文件]

$ ./[脚步所在路径] [参数]

  • 即一种明确告诉系统用perl命令来解析脚步,另外一种是首先让文件具有可执行权限(x)再通过脚本的第一行来解析。

2

 


4.3 Perl中的简单变量(标量)

  • 什么是简单变量(variable):

基本上,简单变量就是一个数据单元,这个单元可以是数字或字符串,一般是单个元素,$开头代表一个简单变量。

  • 简单变量类型:

数字(整数、浮点数)字符及字符串

  • 简单变量的变量名:

用来代表某一个变量,变量的名称,名字【也叫标式符】以字母或下划线开头,可以包含任意长度(这个“任意”值的范围是1到251之间)个字母、数字和下划线,中文名称也行(但由于文件编码格式的原因不推荐使用)。

 

  • 整型数字

Perl中最常用的简单变量,和C、Java等语言中的相似,如:
$x = 20;
$y = 12;

注意:

1.上述的编程单元间的空格是没有现在的,比如 $x=20   ; 也是可以的,但是要遵循一般的编程风格,提高代码的可读性。

2.Perl实际上是把整数当作浮点数看待的。

  • 浮点数

浮点数就是通常我们说的小数,perl中表示小数有几种不同的表示方式:

如 11.4 、 -0.3 、.3 、 3. 、 54.1e+02 、 5.41e03                       其中e表示10的幂。

浮点寄存器通常不能精确地存贮浮点数,从而产生误差,在运算和比较中要特别注意。其指数表示法中的指数的范围通常为-309到+308。

看下面的这个例子:

为什么会出现这种结果呢,那是因为

9.01e+21 + 0.01 – 9.01e+21,  从左往右进行计算时,9.01e+21过大,而0.01相对很小,系统将0.01忽略为0,所以后面的计算就为0。

  • 字符串
  1. 惯用C的程序员要注意,在PERL中,字符串的末尾并不含有隐含的NULL字符,NULL字符可以出现在串的任何位置。
  2. 双引号内的字符串中支持简单变量替换,例如:
  3. 双引号内的字符串中支持转义字符
  4. 单引号不支持上述功能。

常用转义字符

  1. \t : tab
  2. \n : Newline
  3. \L : All following letters are lowercase
  4. \U : All following letters are uppercase
  5. \E : Ends the effect of \L\U
  6. 要在字符串中包含双引号或反斜线,则在其前加一个反斜线,反斜线还可以取消变量替换,如:

 


4.4 Perl中常用操作符

介绍完Perl中的简单变量后,你可能会问如何去对变量进行操作呢,比如数字的加减乘除、字符串的连接等。

  • 操作符简介

操作符是用来操作变量的特殊符号。

  • 算数操作符

+(加)、-(减)、*(乘)、/(除)、**(乘幂)、%(取余)、-(单目取负)

注意: 取余的操作数如不是整数,四舍五入成整数后运算,运算符右侧不能为零;单目负可用于变量: – $y , 等效于 $y * -1

  • 整数比较操作符
操作符 描述
< 小于
> 大于
== 等于
<= 小于等于
>= 大于等于
!= 不等于
<=> 比较,返回 1, 0, or -1

操作符<=>结果表示:

0    –  两个值相等

1    –  第一个值大

-1  –  第二个值大

  • 字符串比较操作符
操作符 描述
lt 小于
gt 大于
eq 等于
le 小于等于
ge 大于等于
ne 不等于
cmp 比较,返回 1, 0, or -1

按照字母顺序依次比较。

  • 逻辑操作符

逻辑或:$a || $b 或者 $a or $b
逻辑与:$a && $b 或者$a and $b
逻辑非:! $a 或者not $a
逻辑异或:$a xor $b

  • 赋值操作符

赋值操作符=, 不能理解为左边等于右边,而应理解为将右边的内容赋给左边的变量。

表达式 等效表达式
$a = 1; none (basic assignment)
$a -= 1; $a = $a – 1;
$a *= 2; $a = $a * 2;
$a /= 2; $a = $a / 2;
$a %= 2; $a = $a % 2;
$a **= 2; $a = $a ** 2;
$a &= 2; $a = $a & 2;
$a |= 2; $a = $a | 2;
$a ^= 2; $a = $a ^ 2;

=可在一个赋值语句中出现多次,如:
  $value1 = $value2 = “a string”;
=作为子表达式
  ($a = $b) += 3;
  等价于
  $a = $b;
  $a += 3;

但建议不要使用这种方式。

  • 自增自减操作符

自增自减操作符是让变量自己增加一个单位或者减少一个单位(++, –)

例如:$x = 2; $y = $x++; #x为3, y为2

 $x = 2; $y = ++$x; #x也为3, y为3

不要在变量两边都使用此种操作符:++$var– # error

 不要在变量自增/减后在同一表达式中再次使用:$var2   = $var1 + ++$var1; # error

 

在PERL中++可用于字符串,但当结尾字符为‘z’、‘Z’、‘9’时进位,如:

  $stringvar = “aBC”;
  $stringvar++; # $stringvar contains “aBD” now

  $stringvar = “bc999”;
  $stringvar++; # $stringvar now contains “bd000“

不要使用–,PERL将先将字符串转换为数字再进行自减,如:
$stringvar = “abc”;
$stringvar–; # $stringvar = -1 now

 

如果字符串中含有非字母且非数字的字符,或数字位于字母中,则经过++运算前值转换为数字零,因此结果为1,如:
$stringvar = “ab*c”;
$stringvar++;
$stringvar = “ab5c”;
$stringvar++; 

  • 字符串连接重复操作符

联接:  .
重复x
联接赋值: .=

  • 逗号操作符

其前面的表达式先进行运算,如:

 

 

  • 条件操作符

与C中类似,条件?1:2当条件为真时取值1,为假时取值2,如:

 

 


4.5 Perl中高级变量(列表、数组)

列表:

列表是包含在括号里的一序列的值,可以为任何数值,也可为空,如:(1, 5.3 , “hello” , 2),空列表:()。注:只含有一个数值的列表(如:(43.2) )与该数值本身(即:43.2 )是不同的,但它们可以互相转化或赋值。例:

 

数组:

列表存贮于数组变量中,与简单变量不同,数组变量以字符”@“打头,如:

@array = (1, 2, 3);

注:

(1)数组变量创建时初始值为空列表:()

(2)因为PERL用@和$来区分数组变量和简单变量,所以同一个名字可以同时用于数组变量和简单变量,如:

$var = 1;

@var = (11, 27.1 , “a string”);

 

数组的存取

对数组中的值通过  [下标]   存取,第一个元素下标为0。试图访问不存在的数组元素,则结果为NULL,但如果给超出数组大小的元素赋值,则数组自动增长,原来没有的元素值为NULL。如:

数组间拷贝

@result = @original;

用列表给数组赋值

数组对简单变量列表赋值

从标准输入(STDIN)给变量赋值

 

列表范围

数组的输出

列表/数组的长度

子数组

 

有关数组操作的库函数(重点*)


4.6 Perl中重要数据结构(关联数组)

关联数组(或者哈希数组)本质上和上节讲到的普通数组类似,都是用一个结构来存储一个集合的所有元素,变量名前面是以%打头,但是关联数组有如下的特点:

  • 以名称作为数组的下标(键:key)
  • 数组中的某个值可以为任何形式的变量(值:value)
  • 键值对(key-value)在数组中的顺序不定(随机)

关联数组在平时的编程中用到的比较多,比如以学号作为关键字(key)来存储班上每个学生的信息(value)、以序列名称作为key来存储序列(value)等,下图形象的展示了关联数组的结构:

3

下面讲讲与关联数组相关的操作:

创建关联数组:

可以用单个赋值语句创建关联数组,如:

%fruit = ();#空的关联数组

%fruit = (“apples”,17,”bananas”,9,”oranges”,”none”);

或者从数组来赋值:

@myfruit = (“apples”,17,”bananas”,9,”oranges”,”none”);

%fruit = @myfruit;

此语句创建的关联数组含有下面三个元素:

下标为apples的元素,值为17

下标为bananas的元素,值为9

下标为oranges的元素,值为none

用列表给关联数组赋值时,Perl5允许使用”=>“或”,“来分隔下标与值,用”=>”可读性更好些,上面语句等效于:

%fruit = (“apples”=>17,”bananas”=>9,”oranges”=>”none”);

 

访问关联数组元素:

关联数组的下标可以为任何简单/标量值,访问单个元素时以$符号打头,下标用大括号{}围起来。例如:$fruit{“bananas”}
$number{3.14159}
$integer{-7}

简单变量也可作为下标,如:

$my_fruit = “apple”;
$fruit{$my_fruit}

 

增加元素:

可以通过给一个未出现过的元素赋值来向关联数组中增加新元素,如$fruit{“lime”} = 1;创建下标为lime、值为1的新元素。

$fruit{“newfruit”} = “12kg”;

 

删除元素:

删除元素的方法是用内嵌函数delete,如欲删除上述元素,则:
delete ($fruit{“lime”});
注意:

1、一定要使用delete函数来删除关联数组的元素,这是唯一的方法。
2、一定不要对关联数组使用内嵌函数push、pop、shift及splice,因为其元素位置是随机的。

 

修改元素:

修改元素就是对已经存在的元素进行重新赋值

#$fruit{“lime”} = 1; 之前lime (key)对应的值(value)是1

$fruit{“lime”} = 10; #修改为10

 

遍历关联数组:

与关联数组遍历(访问所有元素)相关的函数

keys 取出关联数组所有的键作为一个数组

values 取出关联数组所有的值作为一个数组

each 取出关联数组中的任意一个键值对作为列表


 

4.7 Perl编程语法(控制语句)

每一门编程语言都有自己的语法结构,涉及到条件判断、循环等,只是表示方式不同而已。下面是perl语言中的编程语法:

  • 条件判断
  • 循环语句
  • 单行语句

条件判断:

条件判断是对给定表达式进行逻辑判断,根据判断结果做出相应的操作,基本语法结构如下:

上面语法所表示的意思是,首先对expression1进行判断,如果为真则执行block1的代码再退出判断,如果expression1为假则继续对expression2进行判断,如果expression2也为假则依次判断下面的,最后如果都为假则执行else部分代码。

4

 

下面举个例子,根据成绩的不同来进行不同的陈述:

 

循环语句:

循环用来处理一些重复的指令,比如我们常见的一列数字的累加、按行读取文件内容、遍历数组元素等。perl语言中的循环语句有几种不同的表现形式,各有各的特点(注意各种语法中的;所在位置):

下面举几个例子:

特别注意:

  • 数组列表(循环)注意事项:

(1)此处的循环变量localvar是个局部变量如果在此之前它已有值,则循环后仍恢复该值。
(2)在循环中改变局部变量,相应的数组变量也会改变,如:

  • 循环控制

推出循环:last;

跳过当前循环执行下一个循环:next;

 

再看下面几个例子:

遍历(循环)关联数组

  • foreach (for) 方法:

foreach my $keytmp ( keys(%records) ){
print $records{$keytmp}, “\n”;
}

  • while (each) 方法:

while ( ($keytmp, $onerecord) = each(%records) ) {
# 在这里操作键值对
}

each()函数每次返回一个双元素的列表(键值对),其第一个元素为下标,第二个元素为相应的值,最后返回一个空列表。
注意:千万不要在each()循环中添加或删除元素,否则会产生不可预料的后果。

 

单行语句:

语法为statement keyword condexpr。其中keyword可为if、unless、while或until,这样可以减少代码量, 如:
print (“This is zero.\n”) if ($var == 0);
print (“This is zero.\n”) unless ($var != 0);
print (“Not zero yet.\n”) while ($var– > 0);
print (“Not zero yet.\n”) until ($var– == 0);
虽然条件判断写在后面,但却是先执行的。更加符合英文的书写习惯。


 

4.8 Perl文件操作(读、写等)

  • 判断文件状态
  • 打开、关闭文件
  • 读文件
  • 写文件
  • 命令行参数

判断文件状态:

语法为:-op expr,如:
if (-e “/path/file1”) {
print STDERR (“File file1 exists.\n”);
}

常用测试操作符

-d 是否为目录

-e 是否存在

-r 是否可读

-w 是否可写

-x 是否可执行

 

打开、关闭文件:

  • 语法为open (filevar, filename),其中filevar为文件句柄,或者说是程序中用来代表某文件的代号,filename为文件名,其路径可为相对路径,亦可为绝对路径

open(FILE1,”<file1″);

open(FILE1, “</u/jqpublic/file1”);
打开文件时必须决定访问模式,在PERL中有三种访问模式:读、写和添加。后两种模式的区别在于写模式将原文件覆盖,原有内容丢失,形式为:

open(infile,”<inputfile”);

open(outfile,”>outfile”);

而添加模式则在原文件的末尾处继续添加内容,形式为:

open(appendfile, “>>appendfile”)。

要注意的是,不能对文件同时进行读和写/添加操作。

  • Perl中内置的三个输入输出设备句柄

标准输入句柄:STDIN

标准输出句柄:STDOUT

标准错误输出句柄:STDERR

  • open的返回值用来确定打开文件的操作是否成功,当其成功时返回非零值,失败时返回零,因此可以如下判断:

if (open(MYFILE, “myfile”)) {
# here’s what to do if the file opened successfully
}
当文件打开失败时结束程序:
unless (open (MYFILE, “file1”)) {
die (“cannot open input file file1\n”);
}
亦可用逻辑或操作符  单行语句 表示如下:
open (MYFILE, “file1”) || die (“Could not open file”);

或者

open (MYFILE, “file1”) or die (“Could not open file”);

这和上面的两个功能类似, 但是代码量就少很多了。
当文件操作完毕后,用close(MYFILE); 关闭文件。

 

从文件读内容:

打开文件t.txt,设置句柄为MYFILE。

open( MYFILE, “<t.txt”) or die(“can not open the file\n!”);

  • 语句$line = <MYFILE>;

从文件中读取一行数据存储到简单变量$line中并把文件指针向后移动一行。<STDIN>为标准输入文件,通常为键盘输入,不需要打开。

  • 语句@array = <MYFILE>;

把文件的全部内容读入数组@array,文件的每一行(含回车符)为@array的一个元素。

 

综合示例:

 

往文件写内容:

 

关联数组及文件读写小测试:

统计perl帮助手册(man pwd)中每个单词的频数及频率。(此处单词的简单定义为 由空格隔开的字符串)

#大家想想该如何去实现该功能,解决该问题。

 

Perl与操作系统的交互(即调用Linux命令):

。。。。。。

 

4.9 Perl函数简介

  • 函数:

函数是对一项功能的封装,它可以减少重复代码的使用且使程序易读。

  • Perl中的函数(子程序):

内置函数

自定义函数

 

函数function(或者方法method,或者子程序 subroutine)其实都相当于是一个黑盒子,接收相应的输入,提供相应的输出即可。也有时可以没有输入或者输出。

函数基本的语法为:

函数名(参数1, 参数2, …, 参数n)

或者省略()

函数名 参数1, 参数2, …, 参数n

 

内置函数(可以perldoc -f xxx 进行文档查看):

  • print 输出内容
  • join 连接列表/数组
  • split 以指定模式分割字符串为列表/数组
  • length 获取字符串的长度
  • substr 截取字符串
  • sort 对列表/数组排序
  • reverse 反转列表/数组
  • ……

 

  • print “My name is xx”, “\n”; #或者print(“My name is xx”, “\n”);
  • $str = join(“\t”, (“My”, “name”, “is”, “xxx”)); 返回连接后的字符串存到$str变量中
  • split(/:/, “My:name:is:xxx”);
  • length(“My name is xxx”);
  • substr((My name is xxx”, 0, 2);
  • sort((“My”,”name”, “is”, “xx”));
  • reverse ((“My”,”name”, “is”, “xx”));

 

自定义函数:

  • 自定义

用户根据自己的需求来创建函数来完成某项功能。同样是为了分离代码,减少重复代码使用,使程序易读。

  • 定义语法

sub functionname{
statements;
}

其中sub为 subroutine )关键字,不可变动,  functionname 是自己定义的(最好不要和perl的内置函数同名而产生歧义),与sub间有空格, 后面是大括号{}

  • 函数参数(输入)

函数参数是传递给函数的变量(可以是多个变量),由函数内部接收并进行处理,这也是函数的一大特点(适配性),后面还有些更加高级的传递参数方法(如引用,别名等)这里不做介绍了,感兴趣的可以去搜下。

  • 返回值(输出)

缺省的子程序中最后一个语句的值将用作返回值。语句return (retval); 也可以返回值retval,retval可以为列表

  • 如何调用函数

定义好函数后,如何去调用呢?perl中有多中方法来调用,比如:

 

简单函数设计与使用示例:

  • 设计一个函数计算1-n的和,n为输入参数(>0的整数)。

 

4.10 Perl正则表达式

简介:

提到正则表达式(或者模式匹配),大部分人可能不知道这是什么,大家可以去百度百科下 正则表达式:http://baike.baidu.com/link?url=c6jVbMmNRBAKMKv-aNLVuGGmBxiKrqS2tLEwEMewm2kRpXFHK0oAPAu3UfX0-iMVNYs9cjGjMltxSoKFVFc93_ 。这里我们举一个形象的例子让大家来更好的理解正则表达式(或者模式匹配):

看到上面这个问题也可以用其它方法来解决,这里讲下如何通过perl的模式匹配来简单的实现。首先基本的逻辑就是:

先按行读取文件,判断第一列是否为chr1,当是chr1时我们希望留下Note=后面含有MYB字样的行,再继续取出ID=xxx; 这xxx即基因编号部分字符串,最后将结果整合输出。

那这里就涉及到一个问题了怎么去识别一个字符串中是否含有指定字样(模式)呢,这就是正则表达式(模式匹配)所做的。前面Linux基本操作命令中的一些命令如grep sed等都是在用正则表达式来匹配相应行的,而前面perl的split函数其实也是在用正则表达式的。

下面从几个方面具体讲讲正则表达式(模式匹配),参考http://www.cbi.pku.edu.cn/chinese/documents/perl/perl6.htm

 

模式限定符:

那么什么是模式呢?

在perl中,一般由 m/xxxx/ 等表示的即为模式,而xxxx即为具体的模式,而//为模式限定符号,也可以是其它成对的限定符,如## 、{}等,但是我们常用的即为//,且当为//时前面的m可以省略,举例:

m/def/   (或者 /def/ 、m#def#、m{def}等)表示匹配含有def子字符串的模式。

 

模式匹配操作符:

perl中有一些特定的操作符来告诉perl,下面是进行正则表达式操作(模式匹配),分别是:

=~  和 !~

其中=~表示字符串能够与后面的模式匹配,如果能够匹配上则返回1(即真)否则返回空(即假),而!~刚好相反,其具体的语法如下:

somestring =~ /somepattern/

somestring !~ /somepattern/

一般是与if等逻辑语句相结合使用。

比如下面的这个例子:

输出:

 

模式替换操作符:

perl中的模式匹配可以用于字符串的替换操作,也有相应的操作符来表示,即:

somestring =~ s/substring/replacement/ ;

意为如果somestring中含有substring则将substring替换为replacement并返回真,否则返回假。

比如下面的例子:

输出结果:

 

模式捕获次序变量:

上面讲了如何利用模式去进行匹配和替换,这里讲解如何通过模式去进行特定字符串的捕获。perl模式匹配中是利用()来实现对模式的捕获,我们来看下面的这个例子:

上面的模式匹配和普通的差不多,如果模式能够匹配则返回1否则返回假,所以通常与if等联合使用,只是通过()来捕获特定的模式,并把捕获到的字符串自动存储到perl内置的次序变量$1, $2,…,$n中, 这里的n取决于上述()的个数,通过后面掌握更加复杂的模式匹配就能灵活得进行模式捕获操作。

 

模式中的特殊字符(复杂模式):

1. +

在perl的模式匹配中, + 表示匹配之前的字符一次或多次(>=1个),比如/de+f/可以匹配def deef deeef,它是尽可能多的匹配(即贪婪匹配模式),比如下面的这个例子:

这里第一个print会被执行, 而第二个print也会执行且$1是deee 而不是de 或者dee.

有人可能会问那如果要匹配的字符串中就含有+怎么办, 后面会讲到利用转义字符来匹配特殊字符。

2. *

同+类似, *表示匹配之前的字符0次、一次或多次(>=0个),例如/de*f/ 可以匹配 df def deef 。

3. ?

同+ 和 *类似, ?表示匹配之前的字符0次、一次(=0 或者=1个), 例如/de?f/ 可以匹配df def 但是不能匹配deef 。

4. |

5. ()

6. []

7. //

8. ^

9. $

10 .

11. \

 

模式匹配范围:

模式匹配练习:

 

原创文章,转载请注明: 转载自deangao's blog
本文链接地址: 4.3 Perl编程语言介绍