我对Perl中的正则表达式匹配有疑问。请参阅以下代码段:
my $r = '^\z';
my $s = "";
$r =~ /$s/ ? print "Match\n" : print "No match\n";
Output: Match
以下代码段打印:
my $r = '^\z';
$r =~ /""/ ? print "Match\n" : print "No match\n";
Output: No match
为什么呢?这是一个我不理解的Perl语法吗?
答案 0 :(得分:4)
my $s = "";
与
相同my $s = '';
或
my $s = q();
即。它将空字符串分配给$s
。
在
$r =~ /""/
您正在测试$ r是否包含两个双引号。
要为$ s分配一对双引号,请使用
my $s = '""';
答案 1 :(得分:2)
my $r = '^\z';
$r =~ /""/ ? print "Match\n" : print "No match\n";
这里,$ r是测试字符串。 /""/
是正则表达式
""
,因此它不匹配。
此/""/
是由/
char分隔的字符串,其结果变为正则表达式对象。
它相当于:
$str = '""';
$rx = qr/$str/;
答案 2 :(得分:1)
$ s变量没有任何内容。您可以自行检查,只需在代码中添加use re 'debug';
或将-Mre=debug
添加到perl调用中:
第一个例子
$ perl -Mre=debug -E '$r=q{^\z}; $s=""; $r =~ /$s/ ? say "Match" : say "No match"'
Compiling REx ""
Final program:
1: NOTHING (2)
2: END (0)
minlen 0
Matching REx "" against "^\z"
0 <> <^\z> | 1:NOTHING(2)
0 <> <^\z> | 2:END(0)
Match successful!
Match
Freeing REx: ""
第二个例子
$ perl -Mre=debug -E '$r=q{^\z}; $r =~ /""/ ? say "Match" : say "No match"'
Compiling REx "%"%""
Final program:
1: EXACT <""> (3)
3: END (0)
anchored "%"%"" at 0 (checking anchored isall) minlen 2
Guessing start of match in sv for REx "%"%"" against "^\z"
Did not find anchored substr "%"%""...
Match rejected by optimizer
No match
Freeing REx: "%"%""