La forma más sencilla de invertir el orden de las cadenas en una variable de creación

StackOverflow https://stackoverflow.com/questions/52674

  •  09-06-2019
  •  | 
  •  

Pregunta

Digamos que tienes una variable en un fragmento de archivo MAKE como el siguiente:

MY_LIST=a b c d

¿Cómo invierto entonces el orden de esa lista?Necesito:

$(warning MY_LIST=${MY_LIST}) 

mostrar

MY_LIST=d c b a

Editar:el verdadero problema es que

ld -r some_object.o ${MY_LIST}

produce un a.out con símbolos indefinidos porque los elementos en MY_LIST En realidad son archivos, pero en el orden incorrecto.Si el orden de MY_LIST está invertido, se vinculará correctamente (creo).Si conoce una forma más inteligente de acertar en el orden de los enlaces, infórmeme.

¿Fue útil?

Solución

Una solución puramente GNU:

por defecto:todo

foo = por favor invierteme

reverso = $ (si $ (1), $ (llame al revés, $ (lista de palabras 2, $ (palabras $ (1)), $ (1))) $ (Firstword $ (1))

todo :@echo $(llamada inversa,$(foo))

Da:

$ hacer

yo al revés por favor

Otros consejos

¡Doh!Podría haber usado un script de shell: let:

(for d in ${MY_LIST}; do echo $$d; done) | tac

También puedes definir grupos de búsqueda con ld:

ld -r foo.o -( a.a b.a c.a -)

Iterará a través de a.a, b.a y c.a hasta que ningún objeto del grupo pueda satisfacer nuevos símbolos sin resolver.

Si estás usando gnu ld, también puedes hacer:

ld -r -o foo.o --whole-archive bar.a

Lo cual es un poco más fuerte, ya que incluirá todos los objetos de bar.a independientemente de si satisface un símbolo no resuelto de foo.o.

Una mejora a la solución make de GNU:

inversa = $(si $(lista de palabras 2,2,$(1)),$(llamar inversa,$(lista de palabras 2,$(palabras $(1)),$(1))) $(primera palabra $(1) ),$(1))

  • mejor condición de parada, el original usa la cadena vacía desperdiciando una llamada de función
  • no agrega un espacio inicial a la lista invertida, a diferencia del original

Jugando con ambos Ben Collins y elmarco respuestas, aquí hay una apuesta por bash que maneja los espacios en blanco "correctamente"1

reverse = $(shell printf "%s\n" $(strip $1) | tac)

que hace lo correcto, gracias a $(shell) limpieza automática de espacios en blanco y printf formateando automáticamente cada palabra en su lista de argumentos:

$(info [ $(call reverse,  one two   three four  ) ] )

rendimientos:

[ four three two one ]

1...de acuerdo con mi caso de prueba limitado (es decir, el $(info ...) línea, arriba).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top