【问题标题】:How do I skip a line in perl if an error occurs?如果发生错误,如何在 perl 中跳过一行?
【发布时间】:2014-10-01 06:58:59
【问题描述】:

我是 perl 的相对论新手,我正在尝试从日志文件中拆分和解析数据。日志文件包含备份成功与否的信息。

但是,在日志文件中的某一时刻,某个条目会重复出现并导致解析数据时出现问题。如果无法解析,如何跳过该条目?

正常条目在上面,有问题的条目在下面。

> $VAR1 = 'Thu Jul 31 00:35:00 2014'; 
> $VAR2 = 'Daily Backup for (Wed) Jul. 30, 2014 
> STATUS: Successful Thu Jul 31 00:37:22 2014';
> VAR3 = 'Backup Completed: Thu Jul 31 00:40:07 2014


> $VAR1 = 'Fri May 16 00:35:00 2014';
> $VAR2 = 'Daily Backup for (Thu) May. 15, 2014
> STATUS: Successful Fri May 16 00:37:43 2014';
> $VAR3 = 'Daily Backup for (Thu) May. 15, 2014
> STATUS: Successful Fri May 16 00:39:54 2014';
> $VAR4 = 'Backup Completed: Fri May 16 00:42:37 2014



my $stdout = ("cat backup.log");
my @lines = split(/Backup Started: /, $stdout);
shift @lines;

  foreach(@lines)
{

my @backupstarted = split(/\n\n/,$_);
my $start = $backupstarted[0];

my @types = split(/ Backup /, $backuptype);
my $type = $types[0];

my @statuses = split(/ /, $backupstatus);
$statuses[1] =~ s/\://g;
my $status = $statuses[1];

my @enddate = split(/ /, $backup);
my $end = $enddate[0]; 

【问题讨论】:

  • “问题”是什么意思? “不解析”是什么意思?
  • @choroba 我收到了Use of uninitialized value $backup in split at ./backup_stats.pl line 90.,因为这个特定的日志条目(如上所示)与其他日志条目不同。我已经根据正常的日志条目拆分并解析了数据。因此,如果一个条目与规范不同并且无法拆分和解析,我想跳过该条目并继续下一个。

标签: perl parsing logging backup


【解决方案1】:

您的代码存在一些问题。

让我们以正常方式打开文件,首先:

open my $fh, '<', 'backup.log' or die "Couldn't open `backup.log': $!";

my %backup;
my $current_backup;
while (<$fh>) {
    # when we see a new date...
    # set up a new hash ref for its details
    if (/^\w{3} \w{3} \d+ [0-9:]+ 20\d\d/) {
        chomp;
        $backup{$_} = {};
        $current_backup = $_;
    }

    # look for other known types of lines
    if ($current_backup) {
        if (/^(\w+) Backup /) {
            if ($backup{$current_backup}{type}) {
                delete $backup{$current_backup};
                $current_backup = '';
            } else {
                $backup{$current_backup}{type} = $1;
            }
        } elsif (/^STATUS: (\w+)/) {
            $backup{$current_backup}{status} = $1;
        } elsif (/^Backup Completed: (.*)/) {
            $backup{$current_backup}{completed} = $1;
        } else {
        }
    }
}
close $fh;

但即便如此,我认为您实际上如果条目不正常,也不想跳过它。

【讨论】:

  • 感谢您的意见,我会尝试您的解决方案。我实际上是在使用我的$stdout = $ssh-&gt;capture("cat path to log file"); 打开文件。当我通过 SSH 远程运行脚本时。如果不正常,我想跳过该条目,最重要的部分是 STATUS: 是成功还是失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
相关资源
最近更新 更多