Давайте посмотрим на ваш код:
$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
...
}