perl在匹配字符串时打印一个输出

时间:2012-02-15 18:52:33

标签: perl

我正在编写这个简单的代码,以便在我的日志中找到“错误”时收到警报电子邮件。

问题是我想每次扫描只获得一个警报,我的代码会生成基于警报的文件数量匹配错误。

open (LOG, "<$log") || die 'Could not OPEN log file';
while ($loglines = <LOG> ) {
if ($loglines =~ /Error/) { 
    print "Error on the log \n";
}
 }
 close (LOG);

结果看起来像

  

日志错误

     

日志错误

     

日志错误

     

日志错误

     

日志错误

相反,我只想要一个打印“日志错误”,当我在日志文件中匹配错误时,我可以收到一封电子邮件。我错过了什么?

1 个答案:

答案 0 :(得分:3)

open my $LOG, "<", $log or die "Could not OPEN log file $log";
while (my $loglines = <$LOG>) {
  if ($loglines =~ /Error/) { 
   print "Error on the log\n";
   last;
  }
}
close($LOG);

这方面有很多改进。最重要的变化是增加last;;它在第一场比赛中终止了循环。

其他变化是:

  • 使用词汇文件句柄。
  • 使用三参数打开。
  • 使用“or”代替“||”。
  • $loglines的局部变量(假设您不需要/在别处使用它)。
  • 错误消息标识无法打开的文件(更易于调试!)。
  • 打印的留言行上没有尾随空格。

有些人更喜欢在循环中添加标签,然后在last语句中明确使用该标签:

open my $LOG, "<", $log or die "Could not OPEN log file $log";
LOG_READER:
while (my $loglines = <$LOG>) {
  if ($loglines =~ /Error/) { 
   print "Error on the log\n";
   last LOG_READER;
  }
}
close($LOG);

我不相信这里有很多好处,假设没有封闭的循环。如果有任何封闭循环,则使用标签。

我假设您正在使用:

use strict;
use warnings;

在脚本的顶部?如果没有,那就这样做。 Perl专家使用它们来确保它们避免犯愚蠢的错误; Perl新手应该出于同样的原因使用它们。