Perl:匹配时清空$ 1正则表达式值?

时间:2014-07-24 14:13:56

标签: regex perl matching

读者,

我有以下正则表达式问题:

 #!/usr/bin/perl -w
use 5.010;
use warnings;

my $filename = 'input.txt';
open my $FILE, "<", $filename or die $!;

while (my $row = <$FILE>)
{                   # take one input line at a time
    chomp $row;
    if ($row =~ /\b\w*a\b/)
    {
       print "Matched: |$`<$&>$'|\n";  # the special match vars
       print "\$1 contains '$1' \n";
    }
    else
    {
       #print "No match: |$row|\n";
    }
}

input.txt中

I like wilma. 
this line does not match

输出

Matched: |I like <wilma>|
Use of uninitialized value $1 in concatenation (.) or string at ./derp.pl line 14, <$FILE> line 22.
$1 contains ''

我完全糊涂了。如果匹配,我正在检查有条件的东西。为什么我得到1美元的空结果?这不应该发生。我究竟做错了什么?如何让'wilma'获得1美元?

我看了here,但这没有用,因为我得到了一个“匹配”。

1 个答案:

答案 0 :(得分:8)

你的正则表达式中没有任何括号。没有括号,没有$ 1。

我猜你想要&#34;字&#34;以-a结尾的值,因此为/\b(\w*a)\b/

或者,由于您的整个正则表达式只匹配您想要的位,因此您可以使用$&而不是$1,就像在调试输出中一样。

另一个例子:

my $row = 'I like wilma.';
$row =~ /\b(\w+)\b\s*\b(\w+)\b\s*(\w+)\b/;
print join "\n", "\$&='$&'", "\$1='$1'", "\$2='$2'", "\$3='$3'\n";

上面的代码产生了这个输出:

$&='I like wilma'
$1='I'
$2='like'
$3='wilma'