在使用perl的正则表达式中,可以使用m,s等修饰,具体含义通过实例更好理解。
#!/usr/bin/perl -w
use strict;
use warnings;
my $file;
$file = "32'h5a5a_5a5a;\ncity (shanghai beijng\nbelong to China)eeffdd\nlog\n111111111222222222\n";
print $file;
# 执行print $file后得到:
# 32'h5a5a_5a5a;
# city (shanghai beijing
# aabbccdd)eeffdd
# lgo
# 111111111222222222
$file =~ /city(.*)log/;
print $1;
#此处没有模式匹配上,因为 ‘.’ 并不能匹配‘\n'换行符。
$file =~ /city(.*)log/s;
print $1;
# 加上 s 后,可以让 ‘.’ 匹配换行符,这就是它的作用。
# 打印得出:
# (shanghai beijng
# belong to China)eeffdd
$file =~ /^city(.*)$/;
print $1;
# 此时没有模式匹配上,因为 ‘^’代表行首,$file的行首后面紧挨着的是‘32’
$file =~ /^city(.*)$/m;
print $1;
# 加上 m 后,成为多行模式,即将$file 根据 ‘\n’ 来划分每行,一共5行。‘^city’匹配第二行开头
# 打印得出:
# (shanghai beijing
# 注意 beijing后面并没有换行符, 因为没有加上 s , ‘.’无法匹配换行符
# 如果加上 s 会是什么打印效果呢?
$file =~ /^city(.*)$/sm;
print $1;
# 加上 s 后打印效果如下,此时因为 ‘.’ 可以匹配换行符,同时模式匹配默认的是贪婪模式,直接匹配到了最后一行的结尾‘$', 而不是第二行的‘$’;
# 打印结果如下:
# (shanghai beijng
# belong to China)eeffdd
# log
# 111111111222222222
$file =~ /^city(.*?)$/sm;
print $1;
# 如果在 * 后面加上 ?, 启用非贪婪模式,则只匹配到第二行结尾‘$'.
# 打印结果如下:(此时虽然加了 s , beijing后面也没有换行符,因为是非贪婪模式
# (shanghai beijing
‘$'代表的行尾,其实它在有换行符的时候匹配"\n",而不是"\n"的前、后,在没有换行符的时候,匹配行尾。
# 那么我们一般在什么时候会用到 修饰符 m 呢, 比如想匹配 一个 ( ),但是跨行了,此时可以 m s 搭配使用
$file =~ /city(.*)ee/ms;
print $1;
# 打印结果:得到 ( ) 内的内容
# (shanghai beijng
# belong to China)