2012-10-09 8 views
6

Czy istnieje lepszy sposób, aby uzyskać pierwszą literę make zmiennej GNU niżPobierz pierwszą literę zmiennej make

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

(który jest nie tylko niewygodne, ale także wywołuje powłoka zewnętrzna)?

+0

GNU make nie ma wbudowanego w subst funkcja pierścienia, więc nie sądzę, że jest to łatwe lub oczywiste. Może mógłbyś wymyślić coś z '$ (patsubst)' ale nie byłem w stanie. – tripleee

+1

Możliwy duplikat: http://stackoverflow.com/questions/3703881/how-to-return-first-character-of-a-variable-in-gmake –

Odpowiedz

7

Jest to dość straszne, ale przynajmniej nie powoływać shell:

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

Widzę, co tam zrobiłeś. To naprawdę interesujący hack, który pękłby, gdyby z jakiegoś powodu '$ ($ FIRST)' nie był pusty, więc jeśli pierwsza litera sama w sobie jest zmienną zdefiniowaną, czyż nie? – Anaphory

+0

@Anaphory, tak, to by było. Nie widzę żadnego sposobu, aby temu zapobiec. – Beta

2

GNU Make Standard Library zapewnia substr funkcja

substr

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

nie mam przetestowany, ale $(call substr,$(VARIABLE),1,1) powinien działać

+1

Uważam, że powinno to być '$ (wywołanie substr, $ (VARIABLE), 1,1)'. –

+0

gmsl nie wydaje się działać dobrze z automake. Dostaję masę błędów dotyczących niedopasowania jeśli/else/endif, po prostu dodając linię 'include gmsl'. –

+0

@CraigMcQueen, 1) Ups, dzięki, naprawione. 2) nie mogę ci pomóc, przepraszam –

0

Od natknąłem to w moim własnym poszukiwaniu i nie znaleźć to, czego szukasz tutaj jest to, co skończyło się używając do analizowania numer szesnastkowy, które mogą być stosowane do każdego znanego zestawu znaków

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))) 

następnie

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

itp

jest brzydki, ale to powłoka agnostyk

Powiązane problemy