哪些字符可以用作Perl正则表达式的分隔符?m/re/
, m(re)
和måreå
似乎都有效,但我想知道所有的可能性
From 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 "$coden";
my $match;
{
no warnings 'syntax';
($match) = eval $code;
}
print "[$delim] didn't compile with $m$delim$delimn" if $@;
if (defined $match and $match ne 'foo') {
print "[$delim] didn't match correctly ($match)n";
}
}
}
目前词法分析器中有一个错误,有时会阻止将UTF-8字符用作分隔符,即使您可以在未完全使用Unicode模式时将Latin1隐藏。
几乎任何非空白字符都可以使用,但是标识符字符必须用空白与初始m分隔开。虽然当您使用单引号作为分隔符时,它会禁用插值和大多数反斜杠转义。