使用etags正则解析Mojolicious自定义helper定义失败该如何解决
问题原因
你的etags命令生成空TAGS文件是由多个转义、语法兼容问题共同导致的,核心错误如下:
- 转义层级处理错误
命令行中的正则会先后经过shell、etags两层转义解析,你写的\\\(等转义符经过两层解析后已经偏离预期匹配逻辑。 - 正则语法不兼容
etags默认使用POSIX基本正则(BRE),不支持Perl正则的非贪婪量词*?,你原正则中的.*?会被识别为普通字符,无法正常匹配helper名称。 - 匹配场景覆盖不全
你写的正则强制要求helper名称外有引号,无法匹配helper3这种不带引号的合法定义。 - etags格式规则缺失
etags自定义正则需要明确指定捕获组作为tag名称,标准格式为/正则/\1/,用\1指代第一个捕获组作为tag内容,你原正则缺少这部分声明,etags不知道要提取什么内容作为tag。
解决方案
使用如下兼容etags语法的命令即可生成正确的TAGS文件:
etags -l perl --regex='/^\$app->helper(['\''"]?\([^'\''"]*\)['\''"]?[[:space:]]*=>/\1/' ./helpers.pl
命令说明:
- 开头的
^限定匹配行首,避免匹配到代码注释、调用位置等非定义场景的$app->helper字符串 ['\''"]?匹配可选的单/双引号,其中'\''是shell环境下在单引号包裹的内容中插入单引号的标准转义写法\([^'\''"]*\)是POSIX BRE语法的捕获组,通过排除字符集匹配所有非引号的字符,等价于你Perl正则中的非贪婪.*?,兼容所有合法的Mojolicious helper名称写法[[:space:]]*匹配helper名称和=>之间的任意空白字符,兼容不同的代码缩进、空格排版习惯- 末尾的
/\1/告诉etags将第一个捕获组的内容作为tag名称存入TAGS文件
执行上述命令后,生成的TAGS文件就会包含helper1、helper2、helper3三个可识别的tag。
内容的提问来源于stack exchange,提问作者user4035
相关产品推荐
相关产品推荐

