Perl替换操作中如何为数组元素添加换行符?
解决Perl数组替换模板时的换行问题
没问题,这个场景我经常碰到——Perl在插值数组时默认会用空格把元素拼接起来,所以才会出现所有内容挤在一行的情况。要让每个数组元素单独占一行,只需要手动用换行符来连接数组元素,关键是要用到替换的e修饰符,让Perl执行表达式而非直接插值字符串。
具体修改方案
把原来的数组替换语句:
s/%checklist%/@checklist_items/g; s/%logs%/@error_logs/g;
改成:
s/%checklist%/join("\n", @checklist_items)/eg; s/%logs%/join("\n", @error_logs)/eg;
为什么这样有效?
join("\n", @checklist_items):这个表达式会把数组@checklist_items的每个元素用换行符\n连接,生成一个每个元素单独占一行的字符串。e修饰符:告诉Perl替换操作的右侧是一段Perl表达式,需要先执行它得到结果,再用来替换匹配的内容。如果没有e修饰符,Perl会把join(...)当成普通字符串处理,显然达不到我们想要的效果。
额外优化(可选)
如果你希望最后一个元素后面也多一个换行(比如让列表末尾空一行),可以在join结果后追加一个换行:
s/%checklist%/join("\n", @checklist_items) . "\n"/eg;
修改后的完整代码
foreach (@mail_template) { s/%appname%/$appl/g; s/%envir%/$env/g; s/%status%/$final_status/g; s/%date%/$date/g; s/%from%/$from/g; s/%to%/$to/g; s/%filename%/$main::log/g; s/%checklist%/join("\n", @checklist_items)/eg; s/%logs%/join("\n", @error_logs)/eg; print TMP "$_"; }
这样替换后,%checklist%和%logs%的位置就会变成每个数组元素单独一行的格式啦。
内容的提问来源于stack exchange,提问作者olivierg
相关产品推荐
相关产品推荐

