You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:05:57