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

Perl正则匹配空行提取含head的多行文本块问题求解

Perl按空行分块提取含指定关键词文本段实现

需求说明

输入文本以空行作为分隔符划分独立文本块,需要过滤掉所有不包含head关键词的文本块,仅保留含head行的完整文本块写入输出文件。
原有实现思路为将全量文本按换行符拆分为单行存入数组,逐行遍历匹配含head的内容输出,但拆分阶段遇到换行、空行的正则匹配问题,无法得到预期输出。

原有问题代码

my @arr = split("
",$str);

foreach my $token (@arr) {
    print "Inside for\n";
    if($token =~ m[head])
    {
        print "Inside if";
        print $token;
    }
} 

示例文件

输入文件 InputFile.txt 内容

- text1
- text2
- head

- text4
- text5
- non head

- text8
- text9
- head

预期输出文件 OutputFile.txt 内容

- text1
- text2
- head

- text8
- text9
- head

问题根因

  • 拆分逻辑错误:按单个换行符拆分只能得到逐行的单行内容,匹配到head时仅能输出当前行,无法带出同属一个块的其他关联行,不符合按块保留的需求
  • 硬编码换行符兼容性差:不同操作系统的换行符存在差异(Windows为\r\n、类Unix系统为\n),直接写换行符做分隔符容易出现拆分异常,也没有识别空行作为块分隔符的逻辑

修正实现

直接利用Perl内置的段落读取模式,按空行分块读取处理,不需要手动拆分换行、匹配空行:

# 设置输入记录分隔符为空,开启按段落(空行分隔块)读取模式
local $/ = '';
# 打开输入输出文件
open my $in, '<', 'InputFile.txt' or die "打开输入文件失败: $!";
open my $out, '>', 'OutputFile.txt' or die "打开输出文件失败: $!";

# 每次读取一个完整的空行分隔文本块
while (my $block = <$in>) {
    # 块内包含head关键词就整块写入输出
    print $out $block if $block =~ /head/;
}

close $in;
close $out;

逻辑说明

  • 开启段落读取模式后,Perl会自动将连续1个及以上空行识别为块分隔符,自动兼容不同系统的换行符格式,不需要额外写正则匹配空行
  • 直接以块为单位做关键词匹配,匹配通过就整块写入,不需要逐行拼接内容,逻辑更简洁也不会遗漏块内内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 05:09:30