哪些字符可以用作 Perl 正则表达式的分隔符?
m/re/
、m(re)
和måreå
似乎都有效,但我想知道所有可能性。
perlop
:
使用 m,您可以使用任何一对非空白字符作为分隔符。
所以除了空白之外什么都可以。完整段落是:
如果“/”是分隔符,则开头的 m 是可选的。通过 m,您可以使用任意一对非空白字符作为分隔符。这对于匹配包含“/”的路径名特别有用,以避免 LTS(倾斜牙签综合症)。如果 ”?”是分隔符,那么?PATTERN? 的只匹配一次规则适用。如果“'”是分隔符,则不对 PATTERN 执行插值。当使用标识符中有效的字符时,m 后面需要空格。
通常情况下,我想知道“我可以编写一个 Perl 程序来回答这个问题吗?”。
这是尝试所有可打印 ASCII 字符的一个非常好的初步近似:
#!/usr/bin/perl
use warnings;
use strict;
$_ = 'foo bar'; # something to match against
foreach my $ascii (32 .. 126) {
my $delim = chr $ascii;
next if $delim eq '?'; # avoid fatal error
foreach my $m ('m', 'm ') { # with and without space after "m"
my $code = $m . $delim . '(\w+)' . $delim . ';';
# print "$code\n";
my $match;
{
no warnings 'syntax';
($match) = eval $code;
}
print "[$delim] didn't compile with $m$delim$delim\n" if $@;
if (defined $match and $match ne 'foo') {
print "[$delim] didn't match correctly ($match)\n";
}
}
}
目前词法分析器中存在一个错误,有时会阻止将 UTF-8 字符用作分隔符,尽管如果您未处于完整 Unicode 模式,您可以通过它偷偷使用 Latin1。
几乎可以使用任何非空白字符,但标识符字符必须通过空白与初始 m 分隔。 尽管当您使用单引号作为分隔符时,它会禁用插值和大多数反斜杠转义。
一个很晚的答案,但由于匹配运算符
m
是需要一对分隔符的运算符之一。这也通过 m()
在问题本身中得到了体现,这是一个记住您还可以使用平衡对的好时机,例如 <
和 >
等等。
请参阅 # 附录 → perlop 的额外配对定界符列表部分中的完整列表。
如果在替换 (
s///
) 或音译 (y///
) 操作中使用三个分隔符,您可以使用两对,例如 s{}{}
,它们也可以是不同类型,例如 s{}<>
。