Date due variabili stringa $string
e $needle
in perl
, qual è il modo più efficace per controllare se $string
inizia con $needle
.
$string =~ /^\Q$needle\E/
è la corrispondenza più ho potuto pensare che fa ciò che è richiesto, ma è meno efficiente (da lontano) delle soluzioni che ho provato.index($string, $needle) == 0
funziona ed è relativamente efficiente per alcuni valori di$string
e$needle
ma cerca inutilmente l'ago in altre posizioni (se non trovato all'inizio).substr($string, 0, length($needle)) eq $needle
dovrebbe essere abbastanza semplice ed efficiente, ma nella maggior parte dei miei pochi test non è più efficiente del precedente.
C'è un modo canonico per farlo in perl
di cui non sarei a conoscenza o in alcun modo per ottimizzare una delle soluzioni di cui sopra?
(nel mio caso d'uso particolare, $string
e $needle
saranno diversi in ogni esecuzione, quindi precompilare un'espressione regolare non è un'opzione).
Esempio di come misurare le prestazioni di una determinata soluzione (qui da un POSIX sh
):
string='somewhat not so longish string' needle='somew'
time perl -e '
($n,$string,$needle) = @ARGV;
for ($i=0;$i<$n;$i++) {
index($string, $needle) == 0
}' 10000000 "$string" "$needle"
Con questi valori, index()
comporta meglio substr()+eq
con questo sistema con Perl 5.14.2 , ma con:
string="aaaaabaaaaabaaaaabaaaaabaaaaabaaaaab" needle="aaaaaa"
Questo è invertito.
Le diverse versioni di Perl avranno un effetto qui e io consiglio di aggiungere il codice di riferimento che hai usato per il feedback o il riutilizzo. – Ashley
@Ashley, buon punto, aggiornato. –
Forse scriverai 'String :: MoreUtils :: XS'? – pilcrow