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 index
funzione:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
Restituirà la posizione della prima occorrenza di $substr
in $str
o -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 \Q
e \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 -1
quando non riesce a trovare una corrispondenza invece di un undef
o 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.com
trova 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::simple
tutto sembrava un po ' awk
-verso ...: - \
domain.com
corrispondenza subdomain.domain.com
utilizzando 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";
}
:
).