2012-10-09 45 views
6

Có cách nào tốt hơn để có được những ký tự đầu tiên của một biến GNU make hơnLấy chữ cái đầu tiên của một biến làm

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

(mà không phải là duy nhất trở nên cồng kềnh mà còn gọi là vỏ bên ngoài)?

+0

GNU Make không có built-in subst chức năng vòng, vì vậy tôi không nghĩ rằng điều này là dễ dàng hoặc rõ ràng. Có lẽ bạn có thể nghĩ ra cái gì đó liên quan đến '$ (patsubst) 'nhưng tôi không thể. – tripleee

+1

Có thể trùng lặp: http://stackoverflow.com/questions/3703881/how-to-return-the-first-character-of-a-variable-in-gmake –

Trả lời

7

này là khá khủng khiếp, nhưng ít nhất nó không gọi shell:

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

Tôi thấy những gì bạn đã làm ở đó. Đó là một hack thú vị thực sự, và nó sẽ phá vỡ nếu vì lý do nào đó '$ ($ FIRST)' là không trống rỗng, vì vậy nếu chữ cái đầu tiên chính nó là một biến xác định, phải không? – Anaphory

+0

@Anaphory, có, nó sẽ. Tôi không thấy cách nào để ngăn chặn điều đó. – Beta

2

Các GNU Make Standard Library cung cấp một substr substr chức năng

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

Tôi có không đã thử nghiệm nó, nhưng $(call substr,$(VARIABLE),1,1) sẽ hoạt động

+1

Tôi cho rằng nên là '$ (giá trị cuộc gọi, $ (VARIABLE), 1,1)'. –

+0

gmsl dường như không hoạt động tốt với tính năng tự động hóa. Tôi nhận được một loạt các lỗi về không khớp nếu/else/endif, sau khi chỉ cần thêm dòng 'include gmsl'. –

+0

@CraigMcQueen, 1) oops, cảm ơn, đã sửa. 2) không thể giúp bạn với điều đó, xin lỗi –

0

Kể từ khi tôi đi qua này trong tìm kiếm của riêng tôi và không tìm thấy những gì tôi đang tìm kiếm ở đây là những gì tôi đã kết thúc sử dụng để phân tích một số hex có thể được áp dụng cho bất kỳ tập nổi tiếng của nhân vật

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

sau đó

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

, vv

nó xấu xí nhưng nó vỏ thuyết bất khả tri

Các vấn đề liên quan