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

Perl单行命令组合匹配输出异常求助:同时打印对象文件与链接库

问题:转换Make输出文本格式

输入的Make输出每行示例:

hello there -o one two three four -labc -lfoo -lbar
something useless -o abc doo zoo  -lkoo -lfoo -lmoo

期望转换为每行两列的格式:第一列是-o后的所有对象文件,第二列是-l后的所有链接库(去掉-l前缀),用逗号分隔:

one two three four, abc foo bar
abc doo zoo, koo foo moo

原Perl单行命令组合执行时对象文件输出异常:

perl  -ne '/-o(.*?)-/m; @libs = /-l([^ ]+)/gs; printf "%s %s\n", $1 , join(", ", @libs);' inputfile

修正后的命令
perl -ne '/-o\s*(.*?)(?=\s+-|$)/; $objs = $1; $objs =~ s/^\s+|\s+$//; @libs = /-l(\S+)/g; print "$objs, ", join(" ", @libs), "\n"' inputfile

问题原因说明
  1. 原正则/-o(.*?)-/m的缺陷:

    • 非贪婪匹配.*?会捕获到第一个-为止,而这个-是后续-l选项的开头,导致$1末尾带有多余空格
    • 如果-o是该行最后一个选项(无后续-开头的参数),这个正则会匹配失败,$1为空
  2. 修正点:

    • 用正向预查(?=\s+-|$)匹配-o后直到下一个-开头的参数或行尾的内容,确保完整捕获所有对象文件
    • 用$objs =~ s/^\s+|\s+$//去除对象文件字符串首尾的多余空格
    • 链接库匹配/-l(\S+)/g简化为匹配-l后的非空白字符,结果更准确

内容的提问来源于stack exchange,提问作者monk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:15:45