Regex 为什么Perl这个程序无法打印;“成功”;何时正则表达式匹配成功?
我还是Perl的初学者,请耐心听我说。这就是我所经历的情况:Regex 为什么Perl这个程序无法打印;“成功”;何时正则表达式匹配成功?,regex,perl,Regex,Perl,我还是Perl的初学者,请耐心听我说。这就是我所经历的情况: $var = "AB1234567"; $num = "1234567"; next if $var =~ /$num/; print "Success!\n"; 现在,我的理解是,它应该打印“Success!\n”,但实际上不是。但是,如果我将正则表达式更改为next,则$var=~/“$num/,这将实际打印“成功!\n” 但是,如果我将其更改为$var=“AB123456”,原始正则表达式可以正常工作 我知道当使用双引号括起字
$var = "AB1234567";
$num = "1234567";
next if $var =~ /$num/;
print "Success!\n";
现在,我的理解是,它应该打印“Success!\n”,但实际上不是。但是,如果我将正则表达式更改为next,则$var=~/“$num/代码>,这将实际打印“成功!\n”
但是,如果我将其更改为$var=“AB123456”代码>,原始正则表达式可以正常工作
我知道当使用双引号括起字符串时,它将取消对变量的引用。然而,就正则表达式而言,这难道不是真的吗?我已经使用了不带引号的变量完成了正则表达式,它工作得很好
谢谢你的帮助
编辑:
在我的示例中,我省略了分号,但我原来的问题仍然存在
编辑:
我真的应该复制/粘贴。我输入了一个错误,使用了continue if
,而不是next if
。同样,我的问题仍然存在。我不这么认为。这对我很有用:
$var = "AB1234567";
$num = "1234567";
print "Success!\n" if $var =~ /$num/;
要么是因为continue语句,要么是因为变量赋值中缺少分号(您的示例甚至不适用于我……。我想您对continue的作用感到困惑。我不太确定您在这里要做什么,但通常continue
将跳出if块或转到for循环的下一次迭代,while循环等。当模式匹配时,continue
实际上跳过print语句。当您更改$var
的值时,该值将不再匹配,并且将到达print语句
试试这个:
$var = "AB1234567"
$num = "1234567"
print "Success!\n" if $var =~ /$num/;
兰迪
如果(暗示)代码处于循环中,您可能会对qr{}
感兴趣您的代码会说“如果此变量与此正则表达式匹配,则不执行任何操作。否则,打印成功!
”。我怀疑这是你的本意
添加引号并不影响是否对变量进行插值。它所做的是导致正则表达式匹配失败。由于匹配失败,next
[1]未执行,执行到达print语句并成功代码>已打印
代码中的问题与正则表达式、正则表达式中的变量插值或正则表达式中出现的引号完全无关。这是一个简单的倒置条件逻辑错误
尝试将第三行替换为
next unless $var =~ /$num/;
看看当您简单地将代码的逻辑转换为您可能想要的逻辑时会发生什么
[1] :或继续
,具体取决于查看的代码版本让我们看看您的代码:
$var = "AB1234567";
$num = "1234567";
next if $var =~ /$num/;
print "Success!\n";
我假设这是在某个循环体中。当你说
next if $var =~ /$num/;
您的意思是“返回并为下一次迭代执行循环体,如果
匹配/$num/
,则跳过look body中的任何以下语句”。当$var
确实匹配/$num/
时,程序会完全按照您的要求执行,并跳过打印
语句
另一方面,当您使用$var=~/“$num”/
时,右侧的模式变为/“1234567”/
。现在,如果$var=~/“$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";
}
#!/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"
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%""
输出:
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"
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%""
哎呀,我忘了那些分号了。我已经编辑了我原来的帖子,现在就把它们包括进来了。谢谢,接得好。我想我是想用“下一个如果”来代替。我现在就试试你的例子。嗯……不,你的例子对我还是不起作用。谢谢。事实上,你的例子对我很有用。一开始它不起作用,因为我在它前面留下了“nextif”语句。谢谢,尽管我仍然很好奇为什么我的原始代码不起作用。@Evan请看我的答案,以了解为什么您的原始代码不起作用。然后,阅读《perldoc perlsyn》
,也可从中找到。“解除引用”是一个错误的词。它将插值该值。当然“string”或“stringify”值也会在那里工作。哦,我明白了,我明白了。谢谢现在我学了一个新词=)好吧,我原来的例子不是在循环中,我打赌你看到了我的原始代码,我使用了“continue if”。我想用“下一个如果”。不过谢谢你的回复=)你提供给我的链接让我对regex有了更好的理解。