Perl 中的匹配运算符


Perl 中的匹配运算符 m// 用于将字符串或语句与正则表达式匹配。例如,要将字符序列“foo”与标量 $bar 匹配,可以使用如下语句:

示例

 在线演示

#!/usr/bin/perl
$bar = "This is foo and again foo";
if ($bar =~ /foo/) {
   print "First time is matching\n";
   } else {
   print "First time is not matching\n";
}
$bar = "foo";
if ($bar =~ /foo/) {
   print "Second time is matching\n";
   } else {
   print "Second time is not matching\n";
}

执行上述程序时,会产生以下结果:

First time is matching
Second time is matching

m// 的工作方式实际上与 q// 运算符系列相同。您可以使用任何自然匹配字符的组合作为表达式的分隔符。例如,m{}、m() 和 m>< 都是有效的。因此,上述示例可以改写如下:

#!/usr/bin/perl
$bar = "This is foo and again foo";
if ($bar =~ m[foo]) {
   print "First time is matching\n";
   } else {
   print "First time is not matching\n";
}
$bar = "foo";
if ($bar =~ m{foo}) {
   print "Second time is matching\n";
   } else {
   print "Second time is not matching\n";
}

如果分隔符是正斜杠,则可以省略 m,但对于所有其他分隔符,必须使用 m 前缀。

请注意,整个匹配表达式(即 =~ 或 !~ 左侧的表达式和匹配运算符)在标量上下文中返回 true(如果表达式匹配)。因此,语句:

$true = ($foo =~ m/foo/);

如果 $foo 与正则表达式匹配,则将 $true 设置为 1,否则如果匹配失败则设置为 0。在列表上下文中,匹配返回任何分组表达式的内容。例如,在从时间字符串中提取小时、分钟和秒时,我们可以使用:

my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);

Perl 中的匹配运算符修饰符

Perl 匹配运算符支持其自身的一组修饰符。/g 修饰符允许全局匹配。/i 修饰符将使匹配不区分大小写。以下是修饰符的完整列表

序号修饰符和描述
1i
使匹配不区分大小写。
2m
指定如果字符串包含换行符或回车符,则 ^ 和 $ 运算符将匹配换行符边界,而不是字符串边界。
3o
仅评估一次表达式。
4s
允许使用 . 匹配换行符。
5x
允许您在表达式中使用空格以提高清晰度。
6g
全局查找所有匹配项。
7cg
如果文件已存在则停止

更新于: 2019-11-29

1K+ 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告