2011-09-02 27 views

Respuesta

179

Para saber si una cadena contiene subcadena puede utilizar la función index:

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

volverá la posición de la primera aparición de $substr en $str, o -1 si no se encuentra la subcadena.

+5

De esta manera es especialmente preferible, cuando se está buscando usando una variable - de esta manera no tendrá que escapar dos caracteres (en esta cadena variable), que son especiales para expresiones regulares (como ':'). – evgeny9

49

Otra posibilidad es utilizar regular expressions que es lo que Perl es famoso por:

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

Las barras invertidas son necesarios debido a que un . puede coincidir con cualquier carácter. Puede evitar esto utilizando los operadores \Q y \E.

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

O bien, puede hacer lo que declaró eugene y y utilizar la función index. Solo una palabra de advertencia: Index devuelve un -1 cuando no puede encontrar una coincidencia en lugar de undef o 0.

Por lo tanto, esto es un error:

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

Ésta será malo si s1.domain.com es al principio de la cadena. Personalmente me he quemado de esto más de una vez.

+0

Supongo que 'index()' es más rápido que las expresiones regulares en el caso simple? –

+1

Un intento de respuesta perl a una pregunta sobre [eliminar subcadenas] (http://stackoverflow.com/a/35593275/2019415) - No comparé la velocidad, pero '= ~', 'index()', '~~' y ['match :: simple'] (https://metacpan.org/pod/match::simple) todo parecía un poco' awk'-ward ...: - \ –

+0

También debes asegurarte de que las cuerdas que estás comparando no distingue entre mayúsculas y minúsculas. S1.DOMAIN.COM no funcionará para la subcadena. Pero si usted lc ($ givendomain), y luego lo compara con "s1.domain.com", entonces eso funcionará. Además, la subcadena no es necesariamente el enfoque correcto - vea mi nota arriba para la respuesta de eugene y – BlueChips23

11

mayúsculas y minúsculas Subcadena Ejemplo

Ésta es una extensión de la respuesta de Eugene, que convierte las cuerdas a minúsculas antes de comprobar si la subcadena:

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