Erlang中erpc:pmap调用string库函数为何失效?
Erlang erpc:pmap调用string:find返回[nomatch]的原因分析
单独调用string:find/2能正常匹配目标子串:
string:find("This is a test wa.me/123456 message alibaba", "wa.me").
返回预期结果"wa.me/123456 message alibaba",但使用erpc:pmap/3调用时:
erpc:pmap({string,find},["This is a test wa.me/123456 message alibaba"],["wa.me"]).
却返回[nomatch],核心原因是对erpc:pmap/3的参数传递逻辑理解错误,具体如下:
错误原因
erpc:pmap({M,F}, ArgsLists, ExtraArgs)的执行逻辑是:遍历ArgsLists中的每一个参数列表Args,执行apply(M, F, Args ++ ExtraArgs)。
你的写法中,ArgsLists直接传入了目标字符串["This is ..."],但ArgsLists要求是参数列表的集合——每个元素必须是一个完整的参数列表,而非单个参数。当前写法会把目标字符串(字符列表)当作参数列表,再拼接上["wa.me"],最终向string:find传递数十个参数(原字符串的每个字符+模式串),完全不符合string:find/2仅接受2个参数的要求,导致函数执行逻辑偏离预期,返回nomatch。
正确调用方式
要通过erpc:pmap正确调用string:find/2,有两种写法:
- 方式一:将完整的参数列表放入
ArgsLists,ExtraArgs留空
erpc:pmap({string,find}, [["This is a test wa.me/123456 message alibaba", "wa.me"]], []).
- 方式二:将可变参数放入
ArgsLists,固定参数放入ExtraArgs(适用于批量调用时固定某个参数的场景)
erpc:pmap({string,find}, [["This is a test wa.me/123456 message alibaba"]], ["wa.me"]).
两种写法都会正确执行string:find(Str, Pattern),返回预期的["wa.me/123456 message alibaba"]。
另外,若误将目标字符串和模式串的位置搞反,也会导致调用string:find(Pattern, Str),由于模式串中不包含目标字符串,同样会返回[nomatch],需注意参数顺序。
内容的提问来源于stack exchange,提问作者Hassnain
相关产品推荐
相关产品推荐

