Comment puis-je vérifier si une chaîne donnée contient une certaine sous-chaîne, en utilisant Perl?
Plus précisément, je veux voir si s1.domain.com
est présent dans la variable de chaîne donnée.
Pour savoir si une chaîne contient une sous-chaîne, vous pouvez utiliser la fonction index
:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
Il renverra la position de la première occurrence de $substr
dans $str
, ou -1 si la sous-chaîne n'est pas trouvée.
Une autre possibilité consiste à utiliser expressions régulières qui est ce qui fait la réputation de Perl:
if ($mystring =~ /s1\.domain\.com/) {
print qq("$mystring" contains "s1.domain.com"\n);
}
Les barres obliques inverses sont nécessaires car un .
peut correspondre à n’importe quel caractère. Vous pouvez résoudre ce problème en utilisant les opérateurs \Q
et \E
.
my $substring = "s1.domain.com";
if ($mystring =~ /\Q$substring\E/) {
print qq("$mystring" contains "$substring"\n);
}
Ou bien, vous pouvez faire comme eugene y indiqué et utiliser la fonction index . Juste un mot d'avertissement: Index renvoie un -1
lorsqu'il ne peut pas trouver de correspondance au lieu d'un undef
ou 0
.
Donc, ceci est une erreur:
my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
print qq("$mystring" doesn't contains "$substring"\n";
}
Ce sera faux si s1.domain.com
est au début de votre chaîne. J'ai personnellement été brûlé à ce sujet plus d'une fois.
Exemple de sous-chaîne insensible à la casse
Ceci est une extension de la réponse d'Eugene, qui convertit les chaînes en minuscules avant de rechercher la sous-chaîne:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}