2012-07-29 9 views
5

Tengo una cadena, y quiero comprobar si comienza con un cierto carácter (# en este caso). Me gustaría saber la forma más eficiente de hacerlo.¿Cuál es la forma más eficiente de verificar si una cadena comienza con un cierto carácter en TCL?

Lo que estoy pensando es if {[string compare -length 1 $string "#"]}, porque podría usar strcmp() que probablemente sea una de las formas más rápidas de lograr esto.

Lo que creo que también es posible es if {[string index $string 1] == "#"}, porque podría hacer * string == '#', que probablemente también sea muy rápido.

¿Qué opinas?

+1

Mientras 'string compare -length' termina usando el equivalente de' strncmp() ', tiene que ser más cuidadoso de lo que imagina porque Tcl usa caracteres Unicode y no ASCII _and_ NUL es un carácter legal en un Tcl cuerda. –

Respuesta

12

El método más rápido de comprobar si una cadena comienza con un carácter específico es string match:

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

El código para hacer el juego ve que hay una estrella después de que el primer carácter y luego el final de la cadena, y así deja de examinar el resto de $string. Tampoco requiere ninguna asignación de un resultado (que no sea booleano, que es un caso especial ya que string match también está compilado por código de bytes).

+0

Mientras 'string match' era lo más intuitivo que podía pensar, es interesante saber que también es eficiente. Hubiera pensado que sería menos eficiente porque tiene que analizar todo tipo de comodines y cosas así. Bueno, ahora estoy usando 'string match', ¡gracias! – Jerry

+0

@Jerry: el "comodín al final" es un caso especial en el código del emparejador. –

0

Sí [string match "*" $ string_name] esto es lo que funcionó para mí. Esto es realmente rápido en comparación con regexp o cualquier otra utilidad.

Cuestiones relacionadas