为什么Perl这个程序在正则表达式匹配成功时无法打印“成功”?

时间:2010-10-15 22:45:35

标签: regex perl

我还是Perl的初学者,所以请耐心等待。这就是我遇到的情况:

$var = "AB1234567";
$num = "1234567";
next if $var =~ /$num/;
print "Success!\n";

现在,我的理解是它应该打印“成功!\ n”,但实际上它不会。但是,如果我将正则表达式更改为next if $var =~ /"$num"/;,则实际上会打印“成功!\ n”。

但是,如果我将其更改为$var = "AB123456";,原始正则表达式将正常工作。

据我所知,当使用双引号括起字符串时,它将取消引用插入变量。但是,在正则表达式的情况下是不是真的?我使用没有引号的变量完成了正则表达式,并且工作正常。

感谢您的帮助!

编辑:

我在我的例子中遗漏了分号,但我原来的问题仍然存在。

编辑:

我真的应该复制/粘贴。我写了一个拼写错误并用continue if代替next if。同样,我的问题仍然存在。

5 个答案:

答案 0 :(得分:4)

我不这么认为。这对我有用:

$var = "AB1234567";
$num = "1234567";
print "Success!\n" if $var =~ /$num/;

要么是你的继续陈述,要么你在变量赋值中缺少分号(你的例子甚至不能为我运行....)。

答案 1 :(得分:4)

我认为你对continue的作用感到困惑。我不确定你在这里尝试做什么,但通常continue将突破if-block或者转到for-loop,while-loop等的下一次迭代。当模式匹配,continue实际上是跳过print语句。当您更改$var的值时,它不再匹配并且已到达print语句。

试试这个:

$var = "AB1234567"
$num = "1234567"
print "Success!\n" if $var =~ /$num/;

兰迪

答案 2 :(得分:4)

让我们来看看你的代码:

$var = "AB1234567";
$num = "1234567";
next if $var =~ /$num/;
print "Success!\n";

我假设这是在一些循环体内。当你说

next if $var =~ /$num/;

您说“返回并执行循环体以进行下一次迭代,跳过外观主体中的任何后续语句如果 $var匹配/$num/”。当$var确实与/$num/匹配时,该程序会完全按照您的要求执行,并跳过print语句。

另一方面,当您使用$var =~ /"$num"/时,右侧的图案变为/"1234567"/。现在,next if $var =~ /"$num"/中的条件不能成功。并且,您的程序会打印"Success",因为匹配失败。

#!/usr/bin/perl

use strict; use warnings;
use re 'debug';

my $num = "1234567";

for my $var ( qw( AB1234567 ) ) {
    next if $var =~ /$num/;
    print "Success!\n";
}

输出:

Compiling REx "1234567"
Final program:
   1: EXACT  (4)
   4: END (0)
anchored "1234567" at 0 (checking anchored isall) minlen 7
Guessing start of match in sv for REx "1234567" against "AB1234567"
Found anchored substr "1234567" at offset 2...
Starting position does not contradict /^/m...
Guessed: match at offset 2
Freeing REx: "1234567"

现在,让我们使用 /"$num"/ 作为模式:

#!/usr/bin/perl

use strict; use warnings;
use re 'debug';

my $num = "1234567";

for my $var ( qw( AB1234567 ) ) {
    next if $var =~ /"$num"/;
    print "Success!\n";
}

输出:

Compiling REx "%"1234567%""
Final program:
   1: EXACT  (5)
   5: END (0)
anchored "%"1234567%"" at 0 (checking anchored isall) minlen 9
Guessing start of match in sv for REx "%"1234567%"" against "AB1234567"
Did not find anchored substr "%"1234567%""...
Match rejected by optimizer
Success!
Freeing REx: "%"1234567%""

当匹配失败时,您的代码会打印成功!

另见perldoc perlsyn

  

next命令启动循环的下一次迭代:

    LINE: while (<STDIN>) {
    next LINE if /^#/;  # discard comments
    ...
    }

答案 3 :(得分:1)

http://perldoc.perl.org/functions/index.html

C:>perl -e "$x='abc'; $y='bc'; print 'yes' if index($x,$y)>0;"
yes
C:>perl -e "$x='abc'; $y='bc'; print 'yes' if $x =~ /$y/"
yes

如果(如所暗示的)代码处于循环中,您可能会对http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators中的qr{}感兴趣

答案 4 :(得分:0)

您的代码说“如果此变量与此正则表达式匹配,则不执行任何操作。否则,请打印Success!。”。我怀疑这是你的意思。

添加引号不会影响变量是否完全插值。 所做的是导致正则表达式匹配失败。由于匹配失败,next [1]未执行,执行到达打印语句并打印Success!

您的代码问题与正则表达式或正则表达式中的变量插值或正则表达式中出现的引号完全无关。这是一个反向条件的简单逻辑错误。

尝试用

替换第三行
next unless $var =~ /$num/;

看看当你简单地将你的代码的逻辑反转到你可能想要的东西时会发生什么。

[1]:或continue,具体取决于您正在查看的代码版本