web-dev-qa-db-fra.com

Vérifier si une chaîne contient une sous-chaîne

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.

102
Belgin Fish

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.

216
Eugene Yarmash

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.

54
David W.

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";
} 
14
James Oravec