2011-09-02 43 views

Odpowiedz

179

Aby dowiedzieć się, czy ciąg zawiera podciąg można użyć index funkcję:

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

To zwróci pozycję pierwszego wystąpienia $substr w $str, lub -1 gdy podciąg nie zostanie znaleziony.

+5

Ten sposób jest szczególnie preferuje, gdy jesteś przeszukując za pomocą zmiennej - w ten sposób nie będziesz musiał podwójnie uciekać znaków (w tym łańcuchu zmiennych), które są specjalne dla wyrażeń regularnych (jak ':'). – evgeny9

49

Inną możliwością jest użycie regular expressions, która jest co Perl jest znana:

if ($mystring =~ /s1\.domain\.com/) { 
    print qq("$mystring" contains "s1.domain.com"\n); 
} 

są potrzebne backslashe ponieważ . można dopasować do dowolnego znaku. Możesz obejść to, używając operatorów \Q i \E.

my $substring = "s1.domain.com"; 
    if ($mystring =~ /\Q$substring\E/) { 
    print qq("$mystring" contains "$substring"\n); 
} 

Albo można zrobić jak eugene y stwierdził i użyć funkcji index. Tylko słowo ostrzeżenia: Indeks zwraca -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"; 
} 

to będzie źle, jeśli s1.domain.com jest na początku swojej ciąg. Osobiście spaliłem to więcej niż jeden raz.

+0

Przypuszczam, że 'index()' jest szybszy niż regexps w prostym przypadku? –

+1

Próba odpowiedzi perl na pytanie dotyczące [usuwania podciągów] (http://stackoverflow.com/a/35593275/2019415) - Nie porównywałem prędkości, ale '= ~', 'index()', '~~' i ['match :: simple'] (https://metacpan.org/pod/match::simple) wszystko wydawało się trochę' awk'-ward ...: - \ –

+0

Musisz także upewnić się, że struny że porównujesz wielkość liter nie jest rozróżniana. S1.DOMAIN.COM nie będzie działał dla podłańcuchów. Ale jeśli lc ($ givendomain), a następnie porównać to z "s1.domain.com", to będzie działać. Również podłańcuch niekoniecznie jest właściwym podejściem - patrz moja uwaga powyżej do odpowiedzi eugene y – BlueChips23

11

Case Insensitive podciągu Przykład

Jest to rozszerzenie odpowiedzi Eugeniusza, który przekształca sznurki na małe litery przed sprawdzeniem podciągu:

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