2011-09-02 9 views

risposta

179

per verificare se una stringa contiene sottostringa è possibile utilizzare la funzione di index:

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

tornerà la posizione della prima occorrenza di $substr in $str, oppure -1 se la stringa non viene trovata.

+5

In questo modo è particolarmente preferibile, quando si è cercando usando una variabile - in questo modo non dovrai eseguire il double escape dei caratteri (in questa stringa variabile), che sono speciali per le espressioni regolari (come ':'). – evgeny9

49

Un'altra possibilità è quella di utilizzare regular expressions che è ciò che Perl è famosa per:

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

I backslash sono necessari perché un . può adattarsi a qualsiasi carattere. È possibile aggirare questo utilizzando gli operatori \Q e \E.

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

Oppure, si può fare come eugene y dichiarato e utilizzare la funzione index. Solo una parola di avvertimento: Index restituisce un -1 quando non riesce a trovare una corrispondenza invece di un undef o 0.

Quindi, questo è un errore:

my $substring = "s1.domain.com"; 
if (not index($mystring, $substr)) { 
    print qq("$mystring" doesn't contains "$substring"\n"; 
} 

questo sarà male se s1.domain.com è all'inizio della stringa. Sono stato personalmente bruciato su questo più di una volta.

+0

Suppongo che 'index()' sia più veloce di regex nel caso semplice? –

+1

Un tentativo di risposta perl a una domanda su [rimozione sottostringhe] (http://stackoverflow.com/a/35593275/2019415) - Non mi paragono velocità, ma '= ~', 'index()', '' ~~ e ['match :: simple'] (https://metacpan.org/pod/match::simple) sembrava tutto un po '" awk'-ward ...: - \ –

+0

Devi anche assicurarti che le stringhe che stai confrontando non è case sensitive. S1.DOMAIN.COM non funzionerà per la sottostringa. Ma se lc ($ givendomain), e poi lo paragoni con "s1.domain.com", allora funzionerà. Inoltre, sottostringa non è necessariamente l'approccio giusto - vedere la mia nota precedente alla risposta di Eugene y – BlueChips23

11

Case Insensitive Substring Esempio

Si tratta di un'estensione della risposta di Eugenio, che converte le stringhe in minuscolo prima di controllare per la stringa:

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