如何验证文件中当日日期与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
相关产品推荐
相关产品推荐

