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

使用Perl查找目录中多文件里指定字符串的最后出现行

问题分析与修正方案

原代码存在的问题

  • 变量作用域错误:@last在while循环内部声明,循环结束后变量会被销毁,外部的print语句根本无法访问它。而且每次循环都会重新赋值,即使能访问到,也无法保留最后一次匹配的有效内容。
  • 匹配逻辑错误:grep(/FREQ/, $asa)针对单行文本匹配,每次循环都会覆盖@last,无法累积记录最后一次出现"FREQ"的行。
  • 缺少写入文件逻辑:原代码没有打开result.txt并写入结果,仅尝试打印一个不存在的变量,自然没有输出。
  • 无错误处理:打开demo*.txt时未处理文件无法打开的情况,若存在权限问题或文件损坏,代码会静默失败。

修正后的代码

# 打开result.txt文件,以写入模式覆盖原有内容
open my $out_fh, '>', 'result.txt' or die "无法打开result.txt: $!";

# 遍历所有demo*.txt格式的文件
for my $file (glob("demo*.txt")) {
    # 打开当前输入文件,带错误处理
    open my $in_fh, '<', $file or do {
        warn "跳过无法打开的文件: $file ($!)";
        next;
    };
    
    my $last_freq_line; # 存储当前文件中最后一行含"FREQ"的内容
    
    # 逐行读取文件
    while (my $line = <$in_fh>) {
        # 匹配到"FREQ"时,更新变量为当前行
        $last_freq_line = $line if $line =~ /FREQ/;
    }
    
    close $in_fh;
    
    # 将结果写入result.txt,标注来源文件
    if (defined $last_freq_line) {
        print $out_fh "【$file】最后一行含FREQ的内容:\n$last_freq_line\n";
    } else {
        print $out_fh "【$file】未找到包含FREQ的行\n";
    }
}

close $out_fh;

修正关键点说明

  • 作用域优化:$last_freq_line在每个文件的循环内声明,确保每个文件独立记录自己的最后匹配行。
  • 匹配逻辑简化:直接用$line =~ /FREQ/判断当前行是否包含目标字符串,每次匹配成功就更新变量,最终保留最后一次匹配的内容。
  • 文件写入逻辑:提前打开result.txt,将每个文件的结果统一写入,同时标注来源文件,便于后续查看。
  • 错误处理补充:添加warn和next处理文件打开失败的情况,避免程序中断,同时给出明确提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:25:56