Проверьте, содержит ли строка подстроку - PullRequest
100 голосов
/ 02 сентября 2011

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

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

Ответы [ 3 ]

214 голосов
/ 02 сентября 2011

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

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

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

53 голосов
/ 02 сентября 2011

Другая возможность - использовать регулярные выражения , которыми 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 возвращает -1, когда не может найти совпадение вместо undef или 0.

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

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

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

14 голосов
/ 06 января 2015

Пример подстроки без учета регистра

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

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