Проверьте, содержит ли строка подстроку

Как проверить, содержит ли данная строка определенную подстроку, используя Perl?

В частности, я хочу увидеть, присутствует ли s1.domain.com в данной строковой переменной.

Ответ 1

Чтобы узнать, содержит ли строка подстроку, вы можете использовать функцию index:

if (index($str, $substr) != -1) {
    print "$str contains $substr\n";
} 

Он вернет позицию первого вхождения $substr в $str или -1, если подстрока не найдена.

Ответ 2

Другая возможность - использовать регулярные выражения, что является тем, что известно Perl:

if ($mystring =~ /s1\.domain\.com/) {
   print qq("$mystring" contains "s1.domain.com"\n);
}

Обратные косые черты необходимы, потому что . может соответствовать любому символу. Вы можете обойти это, используя операторы \Q и \E.

my $substring = "s1.domain.com";
    if ($mystring =~ /\Q$substring\E/) {
   print qq("$mystring" contains "$substring"\n);
}

Или вы можете сделать это как eugene y и использовать index. Просто слово предупреждения: Index возвращает a -1, когда он не может найти совпадение вместо undef или 0.

Таким образом, это ошибка:

my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
    print qq("$mystring" doesn't contains "$substring"\n";
} 

Это будет неправильно, если s1.domain.com находится в начале строки. Я лично был сожжен этим не один раз.

Ответ 3

Пример нечувствительности к регистру

Это расширение ответа Eugene, которое преобразует строки в нижний регистр перед проверкой подстроки:

if (index(lc($str), lc($substr)) != -1) {
    print "$str contains $substr\n";
}