Невозможно выполнить поиск одной переменной в другой переменной с помощью Perl

#regex #perl

#регулярное выражение #perl

Вопрос:

Используя perl, я не могу выполнить простой поиск, чтобы увидеть, находится ли одно число внутри другого. В приведенном ниже примере не вводится оператор if.

 my $a = "12345";
my $b = "123456789";
if($a=~ m/$b/g) #doesn't work
{
    print "success";
}
  

Приведенное ниже также не работает.

 my $a = "12345";
my $b = "123456789";
if($a =~ /$b/) #doesn't work
{
    print "success";
}
  

Комментарии:

1. если вы хотите проверить, находится ли $a оно в $b , используйте $b =~ m/$a/ ( g флаг не нужен)

2. это немного неинтуитивно, но это сработало …. спасибо! Вместо этого я переключился на поиск по индексу.

3. это вряд ли неинтуитивно… предположим, вы не использовали переменную, это было бы $b =~ m/12345/ … и для поиска и замены, это $b =~ s/12345/abc/ .. так что удаление заключается variable =~ в сопоставлении или поиске и замене по этой переменной

4. Пожалуйста, избегайте использования специальных переменных $a и $b .

5. Или просто однобуквенные имена переменных в целом.

Ответ №1:

Чтобы проверить, находится ли $substr в $string , вы хотите:

 if ($string =~ /Q$substrE/)
  

или

 if (index($string, $substr) >= 0)
  

В вашем случае это означает

 if ($b =~ /Q$aE/)
  

или

 if (index($b, $a) >= 0)
  

Q..E приводит к тому, что содержимое промежуточной переменной сопоставляется буквально, а не обрабатывается как шаблон регулярного выражения.

if (//g) не имеет смысла, и его использование может привести к тонким и очень странным проблемам.

Ответ №2:

Я полагаю, что вы, возможно, перепутали свои переменные в инструкции. $ a = ~ m / $ b / g указывает, что $ b можно найти в $ a (чтобы быть истинным), а не $ a можно найти в $ b . Поскольку $ a меньше по длине, чем $ b, операторы завершаются ошибкой (поскольку 123456789 не может быть найден в 12345).

Я подозреваю, что вы хотите:

 if ( $b =~ m/$a/g )  # or ( $b =~ /$a/ )
{
  print "success";
} 
  

Комментарии:

1. if ( //g ) не имеет смысла, и вы не преобразовали $a в шаблон, используя quotemeta .

Ответ №3:

В регулярных выражениях есть символы, которые могут иметь разные значения. Вместо этого сделайте это:

 if (index($b, $a) != -1) #works