Dividir cadenas

108 views
Skip to first unread message

oco8

unread,
Oct 22, 2011, 6:09:04 PM10/22/11
to golang-spanish
Estoy intentando hacer una implementación completa de la utilidad
"sleep" y necesito dividir las cadenas de los argumentos para separar
el número en sí de la unidad, de la cual se saca el factor para
time.Sleep(). He leído la documentación de "strings" y "strconv" pero
los Splits solo los permiten buscando caracteres. ¿Cómo haría algo
parecido a
/*
// cadena última runa
flag.Args(i)[-1]
*/?

Ivan Zenteno

unread,
Oct 22, 2011, 8:49:19 PM10/22/11
to golang-...@googlegroups.com
Sinceramente no entendí tu duda, primero pensé que te referías al manejo de argumentos y después a manejo de cadenas y por ultimo resultó ser enteros?

Puedes explicarte mejor?


Saludos

oco8

unread,
Oct 23, 2011, 9:27:42 AM10/23/11
to golang-spanish
Supongamos que se hace una llamada a "sleep 3549m". flag.Arg(0) sería
"3549m".
Quiero separar 3549 de 'm' en dos variables distintas. Algo parecido
a:

arg := flag.Arg(0)
index := strconv.LastIndex(arg, unicode_digit)

y dividir la cadena arg en 3549 y "m".

Ivan Zenteno

unread,
Oct 23, 2011, 9:37:23 AM10/23/11
to golang-...@googlegroups.com
No seria mas facil mandarle un solo parametro, tipo sleep(1000) y que estos sean segundos?

Personalmente se me hace algo tedioso tener ese tipo de sleep, como tu comentas; Pero en gustos se rompen generos.

Con respecto a tu pregunta, nunca he tenido que hacer eso. Abria que leer la documentacion para investigar al respecto.

Saludos.

oco8

unread,
Oct 23, 2011, 10:38:00 AM10/23/11
to golang-spanish
On 23 oct, 15:37, Ivan Zenteno <k001.opera...@gmail.com> wrote:
> No seria mas facil mandarle un solo parametro, tipo sleep(1000) y que estos sean segundos?
>
> Personalmente se me hace algo tedioso tener ese tipo de sleep, como tu comentas; Pero en gustos se rompen generos.
>
> Con respecto a tu pregunta, nunca he tenido que hacer eso. Abria que leer la documentacion para investigar al respecto.
>
> Saludos.

Sí, sería más fácil. Pero lo que estoy intentando hacer es una
implementación completa con soporte para unidades de tiempo ('d', 'h',
'm', 's')

oco8

unread,
Oct 23, 2011, 12:35:37 PM10/23/11
to golang-spanish
Ya lo he conseguido. Se trataba simplemente de tratar string como
[]int, siendo cada int una runa. Entonces, lo que escribí sería:
number := flag.Args(0)[len(flag.Args(0)) - 1]
suffix := flag.Args(0)[:len(flag.Args(0)) - 1]
// o más claro:
arg := flag.Args(0)
number := arg[:len(arg) - 1] // == number := arg[0:len(arg) - 1]
suffix := arg[len(arg) - 1]

Lo único que me quedaría es saber si puedo hacer algo como: /*case
'0'...'9':*/ para abreviar /*case '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9':*/.

Ernesto Oltra

unread,
Oct 24, 2011, 2:35:42 AM10/24/11
to golang-...@googlegroups.com
Hazlo con if's. Aquí tienes tb otra solución por si la ves mejor.

  var numero int
  var letra byte
  fmt.Sscanf("1283m", "%d%c", &número, &letra)

Roberto Costumero Moreno

unread,
Oct 24, 2011, 5:44:51 AM10/24/11
to golang-...@googlegroups.com
Hola,

Hacía mucho que no escribía por aquí y el otro día me encontré que es que no estaba recibiendo los correos como debía, y por eso había pensado que la lista estaba en desuso.

Para el problema que comentas tienes dos posibles soluciones:

1- Parseas el argumento con una expresión regular para que te coja solo los números. Con el paquete regexp y el tipo del mismo nombre puedes hacerlo, utilizando las funciones Compile y Find, con una expresión tipo "[0-9]+"

2- La más sencilla pero menos flexible, que sería haciendo lo que comentas, hacer un slice del string obviando el último carácter. Sería tan sencillo como hacer:

arg := flag.Args(i)[:len(flag.Args(i)-1]  (Coge del primer elemento hasta el penúltimo).

Un saludo,

Roberto


2011/10/23 oco8 <ruiz...@gmail.com>

Roberto Costumero Moreno

unread,
Oct 24, 2011, 5:46:07 AM10/24/11
to golang-...@googlegroups.com
Vale, acabo de escribir en el otro hilo dando la solución.

Para lo que comentas del case hazlo con expresiones regulares utilizando el paquete que comenté en el mail anterior ;-)

2011/10/24 Ernesto Oltra <ernest...@gmail.com>
Reply all
Reply to author
Forward
0 new messages