Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Filter 有没有办法用双通配符(百分比)过滤模式?_Filter_Makefile - Fatal编程技术网

Filter 有没有办法用双通配符(百分比)过滤模式?

Filter 有没有办法用双通配符(百分比)过滤模式?,filter,makefile,Filter,Makefile,我想过滤这些行: VAR_LIST += TEST_ORANGE_1_A VAR_LIST += TEST_BLUE_1_A VAR_LIST += TEST_BLUE_1_B VAR_LIST += TEST_BLUE_2_A VAR_LIST += TEST_BLUE_2_B VAR_LIST += TEST_RED_1_A VAR_LIST += TEST_RED_4_C 使用以下类似的过滤器模式: TEST_X_X_X = $(filter TEST_%,$(VAR_LIST))

我想过滤这些行:

VAR_LIST += TEST_ORANGE_1_A
VAR_LIST += TEST_BLUE_1_A
VAR_LIST += TEST_BLUE_1_B
VAR_LIST += TEST_BLUE_2_A
VAR_LIST += TEST_BLUE_2_B
VAR_LIST += TEST_RED_1_A
VAR_LIST += TEST_RED_4_C
使用以下类似的过滤器模式:

TEST_X_X_X = $(filter TEST_%,$(VAR_LIST))                  #works
TEST_ORANGE_X_X = $(filter TEST_ORANGE_%,$(VAR_LIST))      #works
TEST_X_1_X = $(filter TEST_%_1_%,$(VAR_LIST))              #does not work
TEST_X_X_A = $(filter TEST_%_A,$(VAR_LIST))                #works
TEST_X_X_A = $(filter TEST_%_2_B,$(VAR_LIST))              #works
有没有一个简单的方法可以做到这一点

注意:我正在添加以下约束,我从我找到的
.VARIABLES
makefile env.

中获取变量列表:

regex_filter=$(shell echo '$(2)' | tr ' ' '\n' | grep '$(1)' | tr '\n' ' ')
现在:

有一个函数
glob match
,可以满足您的需要。它与的简单版本相匹配,即
*
[…]
表示的字符类。 它不会逐字替换
过滤器
,因为
全局匹配
也能够匹配
(空格字符),因此它无法将其输入作为
生成
列表进行处理。这不是什么大问题,只需定义一个辅助函数
过滤器glob

include gmtt.mk

VAR_LIST += TEST_ORANGE_1_A
VAR_LIST += TEST_BLUE_1_A
VAR_LIST += TEST_BLUE_1_B
VAR_LIST += TEST_BLUE_2_A
VAR_LIST += TEST_BLUE_2_B
VAR_LIST += TEST_RED_1_A
VAR_LIST += TEST_RED_4_C


filter-glob = $(foreach str,$2,$(if $(call glob-match,$(str),$1),$(str)))

$(info $(call filter-glob,TEST_*,$(VAR_LIST)))    
$(info $(call filter-glob,TEST_ORANGE_*,$(VAR_LIST))) 
$(info $(call filter-glob,TEST_*_1_*,$(VAR_LIST)))
$(info $(call filter-glob,TEST_*_A,$(VAR_LIST)))   
$(info $(call filter-glob,TEST_*_2_B,$(VAR_LIST))) 
输出:

$ make
TEST_ORANGE_1_A TEST_BLUE_1_A TEST_BLUE_1_B TEST_BLUE_2_A TEST_BLUE_2_B TEST_RED_1_A TEST_RED_4_C
TEST_ORANGE_1_A
TEST_ORANGE_1_A TEST_BLUE_1_A TEST_BLUE_1_B   TEST_RED_1_A
TEST_ORANGE_1_A TEST_BLUE_1_A  TEST_BLUE_2_A  TEST_RED_1_A
    TEST_BLUE_2_B
make: *** No targets.  Stop.

但是要注意,glob不是正则表达式。像
*\u 1*
这样的模式将匹配
V\u 1\u 0
以及
V\u 2\u 1
,因为它只是在输入流上以
*
的方式无差别地消耗掉。只要你的模式不太复杂,globs是re's tho的一个非常有用的替代品。

为什么你说最后两个“不起作用”?如果你展示了你得到的结果,解释了为什么他们错了,或者解释了你想要得到的结果,这会有很大帮助。它们似乎对我有用。在两种不同的模式上不可能有一个过滤器。第二个
%
被视为文本。如果你需要这样做,你要么(a)使用
$(shell…
)进入一个更强大的解释器,要么(b)使用一些棘手的东西,这将依赖于你确切地知道你需要做什么,以及你能够设置的限制。例如,如果您知道名称总是由“ux”分隔,并且正好有4个元素,那么您可以编写一个make函数,将名称拆分为单词,然后您可以检查单个单词。对不起,我错了“不起作用”是什么使您忽略gmtt解决方案?在这两种情况下,我都必须定义一个函数(regex_filter或filter glob)。gmtt解决方案甚至添加了一个include。因此,我宁愿使用非常灵活和标准的regex而不是gmtt,即使您的解决方案确实有效。无论如何,您的解决方案可能应该得到+1:)“它甚至添加了一个include”。。。这是一个软弱的论点。如果您想在编程中扩展功能,您可以自己现场编程,也可以访问库。我们都是这样做的,不同之处在于gmtt是平台中立的,而您将解决方案绑定到Unix系统,并且不仅了解正则表达式,还了解shell编程——这不是冒犯。
$ make
TEST_ORANGE_1_A TEST_BLUE_1_A TEST_BLUE_1_B TEST_BLUE_2_A TEST_BLUE_2_B TEST_RED_1_A TEST_RED_4_C
TEST_ORANGE_1_A
TEST_ORANGE_1_A TEST_BLUE_1_A TEST_BLUE_1_B   TEST_RED_1_A
TEST_ORANGE_1_A TEST_BLUE_1_A  TEST_BLUE_2_A  TEST_RED_1_A
    TEST_BLUE_2_B
make: *** No targets.  Stop.