Erlang代码调用re:split报bad argument错误,求build_keyword_set正确入参
Erlang re:split/3 抛bad argument异常问题解决
核心错误原因
re:split入参非法:代码中直接将re:compile("\\s+", [unicode])的返回值传给re:split作为第二个参数,而re:compile成功时返回的是{ok, 正则实例}格式的元组,不是re:split要求的正则字符串/编译好的正则实例,直接触发bad argument异常。- 测试入参类型不匹配:你示例中用的
["8"]是字符串列表(元素本质是整数列表),不符合build_keyword_set要求的list(binary())入参规范,Erlang中binary类型需要写成<<"8">>格式。 - 函数spec定义错误:两个函数的返回值声明为
list(string()),但实际返回的是gb_sets集合类型,会导致静态检查报错。
正确入参说明
build_keyword_set的正确入参为元素为binary类型的列表,示例:[<<"hello world">>, <<"erlang test">>]
修改后可运行代码
-module(keywords). -export([start/0]). start() -> BinList = [<<"8">>], Keywords = build_keyword_set(BinList), io:fwrite(" Keywords = ~p~n", [Keywords]). -spec build_keyword_set(list(binary())) -> gb_sets:set(binary()). build_keyword_set([Query|Rest]) -> gb_sets:union(do_build_keyword_set(Query), build_keyword_set(Rest)); build_keyword_set([]) -> gb_sets:new(). -spec do_build_keyword_set(binary() | undefined) -> gb_sets:set(binary()). do_build_keyword_set(undefined) -> gb_sets:new(); do_build_keyword_set(Query) -> {ok, Mp} = re:compile("\\s+", [unicode]), gb_sets:from_list(re:split(Query, Mp, [{return, binary}])).
运行结果
运行后输出: Keywords = {set,1,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[<<"8">>],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}},即成功生成包含拆分后binary的gb_set。
内容的提问来源于stack exchange,提问作者Raja Rokkam
相关产品推荐
相关产品推荐

