Perl正则表达式超详细教程(2)

只是需要注意,将<STDIN>赋值给变量时,将只能读取一行(遇到换行符就结束读取)。例如下面的perl将读取不了"hijklmn"。

echo -e "abcdefg\nhijklmn" | perl test.pl

如果想要读取多行标准输入,就不能将其赋值给变量,而是使用foreach来遍历各行(此处不介绍其它方式):

foreach $line (<STDIN>){ print "$line"; }

以上就是foreach的语法:

圆括号中的内容是待遍历对象,通常是一个列表,比如上面用<STDIN>读取的多行数据就是一个列表,每一行都是列表中的一个元素;

$line称为控制变量,foreach在每次迭代过程中都会选中一个列表中的元素赋值给$line,例如将读取的每一行都赋值给$line。

可以省略$line,这时就采用默认的参数变量$_,所以以下两个表达式是等价的:

foreach (<STDIN>){ print "$_"; } foreach $_ (<STDIN>){ print "$_"; }

6.读取文件中的数据

正则强大的用处就是处理文本数据,所以必须要说明perl如何读取文件数据来做正则匹配。

我们可以将文件作为perl命令行的参数,perl会使用<>去读取这些文件中的内容。

foreach (<>){ print "$_"; }

执行的时候,只要把文件作为perl命令或脚本文件的参数即可:

perl test.pl /etc/passwd

7.去掉行尾分隔符

由于<>和<STDIN>读取文件、读取标准输入的时候总是自带换行符,很多时候这个自带的换行符都会带来格式问题。所以,有必要在每次读取数据时将行尾的换行符去掉,使用chomp即可。

例如:

foreach $line (<STDIN>) { chomp $line; print "$line read\n"; }

以下是执行结果:

[root@xuexi ~]# echo -e "malongshuai gaoxiaofang" | perl 26.plx malongshuai gaoxiaofang read

如果上面的例子中不加上chomp,那么执行结果将像下面一样:

[root@xuexi perlapp]# echo -e "malongshuai gaoxiaofang" | perl 26.plx malongshuai gaoxiaofang read

显然,输出格式和print语句中期待的输出格式不一样。

前面说过,可以省略$line,让其使用默认的参数变量$_,所以可以这样读取来自perl命令行参数文件的数据:

foreach (<>) { chomp; print "$_ read\n"; }

8.命令行的操作模式

其实就是一行式。perl命令行加上"-e"选项,就能在perl命令行中直接写perl表达式,例如:

echo "malongshuai" | perl -e '$name=<STDIN>;print $name;'

因为perl最为人所知的就是它应用了各种符号的组合,让人看着怪异无比,而这些符号放在命令行中很可能会被shell先解析,所以强烈建议"-e"后表达式使用单引号包围,而不是双引号。

更建议,如果可以,不要使用perl命令行的方式,调试起来容易混乱。

perl如何使用正则进行匹配

使用=~符号表示要用右边的正则表达式对左边的数据进行匹配。正则表达式的书写方式为m//。关于m//,其中斜线可以替换为其它符号,规则如下:

双斜线可以替换为任意其它对应符号,例如对称的括号类,m(),m{},相同的标点类,m!!,m%%等等

只有当m模式采用双斜线的时候,可以省略m字母,即//等价于m//

如果正则表达式中出现了和分隔符相同的字符,可以转义表达式中的符号,但更建议换分隔符,例如/http:\/\//转换成m%%

所以要匹配内容,有以下两种方式:

方式一:使用data =~ m/reg/,可以明确指定要对data对应的内容进行正则匹配

方式二:直接/reg/,因为省略了参数,所以使用默认参数变量,它等价于$_ =~ m/reg/,也就是对$_保存的内容进行正则匹配

perl中匹配操作返回的是匹配成功与否,成功则返回真,匹配不成功则返回假。当然,perl提供了特殊变量允许访问匹配到的内容,甚至匹配内容之前的数据、匹配内容之后的数据都提供了相关变量以便访问。见下面的示例。

例如:

1.匹配给定字符串内容

$name = "hello gaoxiaofang"; if ($name =~ m/gao/){ print "matched\n"; }

或者,直接将字符串拿来匹配:

"hello gaoxiaofang" =~ m/gao/;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e1a716f6fc1f35a6ad219d4af05ea1f5.html