Як я можу перевірити, чи містить даний рядок певну підрядку, використовуючи Perl?
Більш конкретно, я хочу дізнатися, чи s1.domain.comє в даній змінній рядку.
Як я можу перевірити, чи містить даний рядок певну підрядку, використовуючи Perl?
Більш конкретно, я хочу дізнатися, чи s1.domain.comє в даній змінній рядку.
Відповіді:
Щоб дізнатись, чи містить рядок підрядку, ви можете скористатися indexфункцією:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
Він поверне позицію першого появи $substrв $str, або -1, якщо підрядка не знайдена.
Іншою можливістю є використання регулярних виразів , чим 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);
}
Або ви можете зробити так, як заявлено yugene y , і використовувати функцію індексу . Просто слово попередження: 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знаходиться на початку вашого рядка. Мене особисто на цьому спалювали не раз.
index()це швидше, ніж регулярні вирази в простому випадку?
=~, index(), ~~і match::simpleвсе , здавалося , трохи awk-ward ...: - \
domain.comдомогтися відповідності subdomain.domain.comза допомогою REGEX вище, будь-які ідеї?
Приклад нечутливої підрядки
Це розширення відповіді Євгена, яке перетворює рядки в малі регістри перед тим, як перевірити наявність підрядка:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}
fcце рекомендується lcдля порівняння, що не враховує регістри.
:).