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

如何验证文件中当日日期与successfully是否在同一行?

解决Perl脚本中匹配当日日期与successfully同行情景的问题

原代码的核心问题

你的现有脚本存在两个关键错误:

  • 两次调用<FILE>会耗尽文件句柄的内容:第一次grep{localtime()} <FILE>已经读取了文件的所有行,第二次grep再读取时文件指针已经在末尾,无法获取内容,导致逻辑判断完全失效。
  • localtime()直接输出的时间格式和文件中的YYYY/MM/DD不匹配,无法正确匹配日期。

正确实现方案

我们需要先生成与文件格式一致的当日日期字符串,再逐行检查每一行是否同时包含该日期和successfully,最后将符合条件的行写入新文件。

完整代码示例

#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw(strftime);

# 生成与文件匹配的当日日期格式(YYYY/MM/DD)
my $today = strftime "%Y/%m/%d", localtime;

# 打开输入文件和输出文件
open(my $input_fh, '<', 'verif_succes.txt') or die "无法打开输入文件: $!";
open(my $output_fh, '>>', 'success_records.txt') or die "无法打开输出文件: $!";

my $found = 0;
while (my $line = <$input_fh>) {
    # 检查当前行是否同时包含当日日期和successfully
    if ($line =~ /\Q$today\E/ && $line =~ /successfully/) {
        print $output_fh $line;  # 写入新文件
        $found = 1;
    }
}

# 输出提示信息
print $found ? "找到匹配行并已写入文件\n" : "未找到匹配行\n";

# 关闭文件句柄
close $input_fh;
close $output_fh;

代码解释

  • 日期格式化:使用POSIX模块的strftime函数,将localtime返回的时间结构转换为文件中使用的YYYY/MM/DD格式,确保日期匹配准确。
  • 文件句柄处理:使用词法文件句柄($input_fh、$output_fh)替代旧式裸字句柄,同时添加die语句捕获文件打开失败的错误。
  • 逐行检查:通过while循环逐行读取文件,对每一行同时检查日期和successfully两个条件,避免文件指针耗尽的问题。
  • 写入新文件:使用追加模式(>>)打开输出文件,避免覆盖已有记录,符合每日新增的需求。

关键细节

  • 使用\Q$today\E可以转义日期中的特殊字符(比如/),避免正则表达式解析错误。
  • 追加模式>>适合每日新增记录的场景,每次运行都会把新的匹配行添加到输出文件末尾。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:47:33