当它作为变量提供时,Perl正则表达式对字符串的匹配方式不同

时间:2014-10-10 15:29:58

标签: regex perl

我对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语法吗?

3 个答案:

答案 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: "%"%""