Ho bisogno di implementare un programma per contare l'occorrenza di una sottostringa in una stringa in perl. l'ho implementato come segueCome posso contare le sottostringhe sovrapposte in Perl?
sub countnmstr
{
$count =0;
$count++ while $_[0] =~ /$_[1]/g;
return $count;
}
$count = countnmstr("aaa","aa");
print "$count\n";
ora questo è quello che vorrei fare normalmente. tuttavia, nell'implementazione precedente voglio contare l'occorrenza di 'aa' in 'aaa'. qui ottengo risposta come 1 che sembra ragionevole, ma ho bisogno di considerare anche i casi che si sovrappongono. quindi il caso sopra dovrebbe dare una risposta come 2 poiché ci sono due "aa" se consideriamo la sovrapposizione.
qualcuno può suggerire come implementare tale funzione ??
È possibile utilizzare il cosiddetto "operatore goatse" (non è proprio un operatore) per ottenere un conteggio in un unico passaggio: 'my $ count =() = $ string = ~/$ sottostringa/g;' . Ciò non risolve il rilevamento di sottostringhe sovrapposte. I'll the GO nel prossimo commento. – daotoad
L'operatore "goatse" o GO funziona perché, se valutato in contesto scalare, l'assegnazione a una lista restituisce il numero di elementi forniti per l'assegnazione. Considera questo esempio: '$ foo =() = (1,3,2,9) ';', l'elenco di numeri è assegnato alla lista vuota. Tutti i valori vengono scartati, ma l'assegnazione stessa viene valutata per ottenere il valore di '$ pippo'. Poiché '$ pippo' è uno scalare, valutiamo l'assegnazione dell'elenco e otteniamo' 4'. Pertanto, GO può essere utilizzato per eliminare una matrice temporanea inutile. – daotoad