0

好的,这是我的最后一个问题(当天):我正在尝试让我的程序搜索文档。如果文档的任何地方都包含“不成功”一词,则程序将搜索“错误”一词并记录所有错误实例。但是,我很难让两者相互依赖。请帮忙!我对 Perl 非常陌生(这只是我使用它的第二天)所以您可以提供的详细信息/评论越多越好!这是我当前的代码,我知道它现在不能运行:

#!/usr/local/bin/perl


my $argument1 = $ARGV[0];
my $argument2 = $ARGV[1];
open (LOGFILE, "<$argument1") or die "Can't find file";         
open FILE, ">>$argument2" or die $!;
while (<LOGFILE>){
    if {(/Unsuccessful/){
    while(<LOGFILE>){
     if (/Error/){ 
        print FILE "ERROR in line $.\n" ;
    }

}
}
}
}

关闭文件;关闭日志文件;

4

3 回答 3

1

在一个循环中检查“不成功”和“错误”,如果发现“不成功”,最后打印错误结果......

my $argument1 = $ARGV[0];
my $argument2 = $ARGV[1];

open (LOGFILE, "<$argument1") or die "Can't find file";         
open (FILE,   ">>$argument2") or die $!;

my $unsuccessful = 0;
my @errors = ();

while (<LOGFILE>) {
  if (/Unsuccessful/i) {
    $unsuccessful = 1;
  }
  if (/Error/i) {
    push(@errors, "ERROR in line $.\n");
  }
}

if ($unsuccessful) {
  print $_ for @errors;
}

Switch/i适用于不区分大小写的搜索,因此如果不需要,请将其从上面的代码中删除。

于 2012-06-06T22:06:06.320 回答
0

使用

<LOGFILE>

多次可能不是你想要的。导致您遇到麻烦的更直接原因可能是放置不当的“{”。

看起来您希望“错误”总是晚于“不成功”出现,对吧?

尝试

my $argument1 = $ARGV[0];
my $argument2 = $ARGV[1];

open (LOGFILE, "<$argument1") or die "Can't find file";         
open FILE, ">>$argument2" or die $!;

my $unsuccessful = 0;

while (<LOGFILE>){
    if ($unsuccessful) {
        if (/Error/) { print FILE "ERROR in line $.\n"; }
    }
    else {
        if (/Unsuccessful/) { $unsuccessful = 1; }
    }
}

close FILE;
close LOGFILE;
于 2012-06-06T20:54:48.287 回答
0

在第 1 步之前执行第 5 步,您犯了一个严重错误。您没有在代码中使用strictandwarning编译指示。实际上,您发布的代码无法编译。

至于所讨论的问题,假设您只想解析每个文件一次(作为一个优秀的程序员应该努力做到的),您应该以两种模式进行解析:(1)unsuccessful已检测到的模式,以及它所在的模式尚未被发现。前者将负责输出行,而后者则不会。

现在我建议回到一些基础,不要提前采取措施。过去我自己在第 1 步之前已经多次执行第 5 步,但每次都是错误的。

于 2012-06-06T21:00:16.993 回答