Jak mogę sprawdzić, czy dany ciąg zawiera określony podciąg, używając Perla?
Dokładniej, chcę sprawdzić, czy s1.domain.com
wystę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.com
występuje w danej zmiennej ciągu.
Odpowiedzi:
Aby dowiedzieć się, czy ciąg zawiera podciąg, możesz użyć index
funkcji:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
Zwróci pozycję pierwszego wystąpienia $substr
in $str
lub -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 \Q
i \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, -1
gdy nie może znaleźć dopasowania zamiast undef
lub 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.com
znajduje 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::simple
wszystko wydawało się nieco awk
-ward ...: - \
domain.com
dopasować subdomain.domain.com
uż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";
}
:
).