2012-07-29 15 views
5

Ho una stringa e voglio verificare se inizia con un certo carattere (# in questo caso). Mi piacerebbe sapere il modo più efficiente per farlo!Qual è il modo più efficace per verificare se una stringa inizia con un certo carattere in TCL?

Quello che sto pensando è if {[string compare -length 1 $string "#"]}, perché potrebbe utilizzare strcmp() che probabilmente sarà uno dei modi più veloci per raggiungere questo obiettivo.

Quello che penso potrebbe essere possibile è if {[string index $string 1] == "#"}, perché potrebbe fare * string == '#' che probabilmente sarà anche molto veloce.

Cosa ne pensi?

+1

Mentre 'string compare -length' finisce per usare l'equivalente di' strncmp() ', deve essere più accurato di quanto si possa immaginare perché Tcl usa caratteri Unicode e non ASCII _and_ NUL è un carattere legale in un Tcl stringa. –

risposta

12

Il metodo più veloce di verificare se una stringa inizia con un carattere specifico è string match:

if {[string match "#*" $string]} { ... } 

Il codice per fare l'abbinamento vede che c'è una stella dopo il primo carattere e poi la fine della stringa, e così smette di esaminare il resto di $string. Inoltre, non richiede alcuna allocazione di un risultato (diverso da quello booleano, che è un caso speciale dal momento che string match è anche codificato in bytecode).

+0

Mentre 'stringa di corrispondenza 'era la cosa più intuitiva che potessi pensare, è interessante apprendere che è anche efficiente. Avrei pensato che sarebbe meno performante perché deve analizzare tutti i tipi di caratteri jolly e cose del genere. Bene, ora sto usando 'stringa match ', grazie! – Jerry

+0

@Jerry: Il "carattere jolly alla fine" è un caso speciale nel codice di abbinamento. –

0

Sì [stringa di corrispondenza "*" $ nome_stringa] questo è ciò che ha funzionato per me. Questo è veramente veloce rispetto a regexp o qualsiasi altra utility.

Problemi correlati