哪些字符可以用作Perl正则表达式的分隔符? m/re/
,m(re)
和måreå
似乎都有效,但我想了解所有可能性。
答案 0 :(得分:23)
来自perlop
:
使用m,您可以使用任何一对非空白字符作为分隔符。
所以任何事情都会发生,除了空白。完整的段落是:
如果“/”是分隔符,则初始m是可选的。使用m,您可以使用任何一对非空白字符作为分隔符。这对于匹配包含“/”的路径名特别有用,以避免LTS(倾斜牙签综合征)。如果“?”是分隔符,然后是“PATTERN”的仅匹配一次规则?适用。如果“'”是分隔符,则不对PATTERN执行插值。当在标识符中使用有效字符时,在m。
之后需要空格
答案 1 :(得分:5)
通常情况下,我想知道“我可以写一个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";
}
}
}
答案 2 :(得分:4)
几乎可以使用任何非空白字符,但标识符字符必须通过空格与初始m分开。虽然当你使用单引号作为分隔符时,它会禁用插值和大多数反斜杠转义。
答案 3 :(得分:3)
词法分析器中目前存在一个错误,有时会阻止将UTF-8字符用作分隔符,即使你没有处于完全Unicode模式也可以使用它来偷偷摸摸拉丁语。