2012-10-09 12 views
6

¿Hay una mejor manera de conseguir el primer carácter de una variable de GNU make queObtener la primera letra de una variable maquillaje

FIRST=$(shell echo $(VARIABLE) | head -c 1) 

(que no sólo es difícil de manejar sino que exige la cáscara externa)?

+0

GNU make no tiene incorporado de subst funcionalidad del anillo, así que no creo que esto sea fácil u obvio. Tal vez podrías encontrar algo relacionado con '$ (patsubst)' pero no pude. – tripleee

+1

Posible duplicado: http://stackoverflow.com/questions/3703881/how-to-return-the-first-character-of-a-variable-in-gmake –

Respuesta

7

Esto es bastante horrible, pero al menos no invocar shell:

$(eval REMAINDER := $$$(VAR))   # variable minus the first char 
FIRST := $(subst $(REMAINDER),,$(VAR)) # variable minus that 
+2

Veo lo que hizo allí. De hecho, es un truco interesante, y se rompería si por alguna razón '$ ($ FIRST)' no estuviera vacío, entonces si la primera letra es en sí misma una variable definida, ¿no es así? – Anaphory

+0

@Anaphory, sí, lo haría. No veo ninguna forma de prevenir eso. – Beta

2

El GNU Make Standard Library proporciona una función substr substr

Arguments: 1: A string 
      2: Start offset (first character is 1) 
      3: Ending offset (inclusive) 
Returns: Returns a substring 

yo no tengo lo probó, pero $(call substr,$(VARIABLE),1,1) debería funcionar

+1

Creo que debería ser '$ (call substr, $ (VARIABLE), 1,1)'. –

+0

gmsl no parece funcionar bien con automake. Recibo un montón de errores sobre el desajuste if/else/endif, después de simplemente agregar la línea 'include gmsl'. –

+0

@CraigMcQueen, 1) Ups, gracias, corregidos. 2) no puedo ayudarte con eso, lo siento –

0

Dado que me encontré con esto en mi propia búsqueda y no encontrar lo que estaba buscando aquí es lo que terminé usando para analizar un número hexadecimal que se podría aplicar a cualquier conjunto de caracteres conocido

letters := 0 1 2 3 4 5 6 7 8 9 a b c d e f 
nextletter = $(strip $(foreach v,$(letters),$(word 2,$(filter $(1)$(v)%,$(2)) $v))) 

continuación

INPUT := 40b3 
firstletter := $(call nextletter,,$(INPUT)) 
secondletter := $(call nextletter,$(firstletter),$(INPUT)) 
thirdletter := $(call nextletter,$(firstletter)$(secondletter),$(INPUT)) 

etc.

es feo, pero es agnóstico cáscara

Cuestiones relacionadas