Come posso verificare se una data stringa contiene una certa sottostringa, usando Perl?
Più specificamente, voglio vedere se s1.domain.comè presente nella variabile stringa data.
Come posso verificare se una data stringa contiene una certa sottostringa, usando Perl?
Più specificamente, voglio vedere se s1.domain.comè presente nella variabile stringa data.
Risposte:
Per scoprire se una stringa contiene una sottostringa puoi usare la indexfunzione:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
Restituirà la posizione della prima occorrenza di $substrin $stro -1 se la sottostringa non viene trovata.
Un'altra possibilità è usare espressioni regolari, che è ciò per cui Perl è famoso:
if ($mystring =~ /s1\.domain\.com/) {
print qq("$mystring" contains "s1.domain.com"\n);
}
I backslash sono necessari perché a .può corrispondere a qualsiasi carattere. Puoi aggirare questo problema usando gli operatori \Qe \E.
my $substring = "s1.domain.com";
if ($mystring =~ /\Q$substring\E/) {
print qq("$mystring" contains "$substring"\n);
}
Oppure puoi fare come ha dichiarato Eugenio e utilizzare la funzione indice . Solo un avvertimento: Index restituisce un -1quando non riesce a trovare una corrispondenza invece di un undefo 0.
Quindi, questo è un errore:
my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
print qq("$mystring" doesn't contains "$substring"\n";
}
Questo sarà sbagliato se si s1.domain.comtrova all'inizio della stringa. Personalmente sono stato bruciato su questo più di una volta.
index()sia più veloce delle espressioni regolari nel caso semplice?
=~, index(), ~~e match::simpletutto sembrava un po ' awk-verso ...: - \
domain.comcorrispondenza subdomain.domain.comutilizzando il REGEX sopra, qualche idea?
Esempio di sottostringa senza distinzione tra maiuscole e minuscole
Questa è un'estensione della risposta di Eugene, che converte le stringhe in minuscolo prima di verificare la sottostringa:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}
:).