使用String::Approx实现自定义错配的Perl字符串搜索问题咨询
关于String::Approx模块aindex函数的行为解释
你的问题核心是对String::Approx中aindex函数的匹配逻辑理解有误:
aindex默认会返回错误数最少的近似匹配位置,而非字符串中第一个满足错配阈值的位置。如果存在多个错误数相同的最优匹配,才会返回最左侧的那个。
你的例子分析
你的字符串$a是"Aperlisaparlhardobjectproduced...",目标模式$b是"paal":
- 当设置
["I0", "D0", "S1"]时:
只有位置8的子串parl满足1次替换(r→a)的条件,因此返回8,符合你的预期。 - 当设置
S2或S3时:
位置1的子串perl需要2次替换(e→a、r→a),虽然满足错配阈值,但位置8的子串仍然只需要1次替换(错误数更少),属于最优匹配。因此aindex会优先返回这个错误最少的位置8,而非你预期的位置1。
如何返回第一个满足阈值的匹配
如果你想让函数返回字符串中第一个满足错配阈值的匹配位置(不优先考虑错误数多少),可以添加"R"(relaxed)选项,示例代码:
use String::Approx 'aindex'; $a="Aperlisaparlhardobjectproduced..."; $b="paal"; print aindex($b, ["I0", "D0", "S2", "R"], $a);
此时函数会从左到右扫描,找到第一个满足最多2次替换的匹配(位置1的perl)并返回。
内容的提问来源于stack exchange,提问作者Nirvana
相关产品推荐
相关产品推荐

