Como posso verificar se uma determinada string contém uma determinada substring, usando Perl?
Mais especificamente, quero ver se s1.domain.com
está presente na variável string fornecida.
Como posso verificar se uma determinada string contém uma determinada substring, usando Perl?
Mais especificamente, quero ver se s1.domain.com
está presente na variável string fornecida.
Respostas:
Para descobrir se uma string contém substring, você pode usar a index
função:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
Ele retornará a posição da primeira ocorrência de $substr
in $str
, ou -1 se a substring não for encontrada.
Outra possibilidade é usar expressões regulares, pelas quais o Perl é famoso:
if ($mystring =~ /s1\.domain\.com/) {
print qq("$mystring" contains "s1.domain.com"\n);
}
As barras invertidas são necessárias porque um .
pode corresponder a qualquer caractere. Você pode contornar isso usando os operadores \Q
e \E
.
my $substring = "s1.domain.com";
if ($mystring =~ /\Q$substring\E/) {
print qq("$mystring" contains "$substring"\n);
}
Ou, você pode fazer como Eugene y declarado e usar o índice de função. Apenas um aviso: o índice retorna um -1
quando não consegue encontrar uma correspondência em vez de undef
ou 0
.
Portanto, este é um erro:
my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
print qq("$mystring" doesn't contains "$substring"\n";
}
Isso estará errado se s1.domain.com
estiver no início de sua string. Eu pessoalmente fui queimado nisso mais de uma vez.
index()
seja mais rápido do que regexps no caso simples?
=~
, mas index()
, ~~
e match::simple
tudo parecia um pouco awk
estranho ...: - \
domain.com
para corresponder subdomain.domain.com
usando o REGEX acima, todas as idéias?
Exemplo de substring que não diferencia maiúsculas de minúsculas
Esta é uma extensão da resposta de Eugene, que converte as strings em minúsculas antes de verificar a substring:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}
:
).