1. 程式人生 > >foreach 函式

foreach 函式

$(foreach VAR,LIST,TEXT)
 
函式功能:這個函式的工作過程是這樣的:如果需要(存在變數或者函式的引用),首先展開變數“VAR”和“LIST”的引用;而表示式“TEXT”中的變數引用不展開。執行時把“LIST”中使用空格分割的單詞依次取出賦值給變數“VAR”,然後執行“TEXT”表示式。重複直到“LIST”的最後一個單詞(為空時結束)。“TEXT”中的變數或者函式引用在執行時才被展開,因此如果在“TEXT”中存在對“VAR”的引用,那麼“VAR”的值在每一次展開式將會到的不同的值。
        返回值:空格分割的多次表示式“TEXT”的計算的結果。
我們來看一個例子,定義變數“files”,它的值為四個目錄(變數“dirs”代表的a、b、c、d四個目錄)下的檔案列表:
 
dirs := a b c d
files := $(foreach dir,$(dirs),$(wildcard $(dir)/*))
 
例子中,“TEXT”的表示式為“$(wildcard $(dir)/*)”。表示式第一次執行時將展開為“$(wildcard a/*)”;第二次執行時將展開為“$(wildcard b/*)”;第三次展開為“$(wildcard c/*)”;….;以此類推。所以此函式所實現的功能就和一下語句等價:
 
files := $(wildcard a/* b/* c/* d/*)
 
當函式的“TEXT”表示式過於複雜時,我們可以通過定義一箇中間變數,此變數代表表示式的一部分。並在函式的“TEXT”中引用這個變數。上邊的例子也可以這樣來實現:
 
find_files = $(wildcard $(dir)/*)
dirs := a b c d
files := $(foreach dir,$(dirs),$(find_files))
 
在這裡我們定義了一個變數(也可以稱之為表示式),需要注意,在這裡定義的是“遞迴展開”時的變數“find_files”。保證了定義時變數值中的引用不展開,而是在表示式被函式處理時才展開(如果這裡使用直接展開式的定義將是無效的表示式)。