Jak mogę sprawdzić, czy dany ciąg zawiera określony podciąg, używając Perla?
Dokładniej, chcę sprawdzić, czy s1.domain.comwystępuje w danej zmiennej ciągu.
Jak mogę sprawdzić, czy dany ciąg zawiera określony podciąg, używając Perla?
Dokładniej, chcę sprawdzić, czy s1.domain.comwystępuje w danej zmiennej ciągu.
Odpowiedzi:
Aby dowiedzieć się, czy ciąg zawiera podciąg, możesz użyć indexfunkcji:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
Zwróci pozycję pierwszego wystąpienia $substrin $strlub -1, jeśli podciąg nie zostanie znaleziony.
Inną możliwością jest użycie wyrażeń regularnych, z czego słynie Perl:
if ($mystring =~ /s1\.domain\.com/) {
print qq("$mystring" contains "s1.domain.com"\n);
}
Ukośniki odwrotne są potrzebne, ponieważ a .może pasować do dowolnego znaku. Możesz to obejść za pomocą operatorów \Qi \E.
my $substring = "s1.domain.com";
if ($mystring =~ /\Q$substring\E/) {
print qq("$mystring" contains "$substring"\n);
}
Lub możesz zrobić tak, jak powiedział eugene y i użyć funkcji indeksu . Tylko słowo ostrzeżenia: indeks zwraca a, -1gdy nie może znaleźć dopasowania zamiast undeflub 0.
Tak więc jest to błąd:
my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
print qq("$mystring" doesn't contains "$substring"\n";
}
Będzie źle, jeśli s1.domain.comznajduje się na początku twojego ciągu. Osobiście byłem tym palony więcej niż raz.
index()jest szybszy niż wyrażenia regularne w prostym przypadku?
=~, index(), ~~i match::simplewszystko wydawało się nieco awk-ward ...: - \
domain.comdopasować subdomain.domain.comużywając powyższego REGEX, jakieś pomysły?
Przykład podłańcucha bez rozróżniania wielkości liter
To jest rozszerzenie odpowiedzi Eugene'a, która konwertuje ciągi znaków na małe litery przed sprawdzeniem podłańcucha:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}
:).