Як я можу перевірити, чи містить даний рядок певну підрядку, використовуючи 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
для порівняння, що не враховує регістри.
:
).