¿Cómo puedo comprobar si una determinada cadena contiene una determinada subcadena, utilizando Perl?
Más específicamente, quiero ver si s1.domain.com
está presente en la variable de cadena dada.
¿Cómo puedo comprobar si una determinada cadena contiene una determinada subcadena, utilizando Perl?
Más específicamente, quiero ver si s1.domain.com
está presente en la variable de cadena dada.
Respuestas:
Para saber si una cadena contiene una subcadena, puede usar la index
función:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
Devolverá la posición de la primera aparición de $substr
in $str
, o -1 si no se encuentra la subcadena.
Otra posibilidad es usar expresiones regulares, que es por lo que Perl es famoso:
if ($mystring =~ /s1\.domain\.com/) {
print qq("$mystring" contains "s1.domain.com"\n);
}
Las barras invertidas son necesarias porque .
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 puede hacer lo que eugene y dijo y usar la función de índice . Solo una advertencia: el índice devuelve un -1
cuando no puede encontrar una coincidencia en lugar de un undef
o 0
.
Por tanto, esto es un error:
my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
print qq("$mystring" doesn't contains "$substring"\n";
}
Esto será incorrecto si s1.domain.com
está al principio de su cadena. Personalmente, me han quemado con esto más de una vez.
index()
es más rápido que las expresiones regulares en el caso simple?
=~
, index()
, ~~
y match::simple
todo parecía un poco awk
-WARD ...: - \
domain.com
igualar subdomain.domain.com
usando el REGEX anterior, ¿alguna idea?
Ejemplo de subcadena que no distingue entre mayúsculas y minúsculas
Esta es una extensión de la respuesta de Eugene, que convierte las cadenas a minúsculas antes de verificar la subcadena:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}
:
).