Perl同时发表声明

时间:2012-06-06 20:45:39

标签: perl while-loop

好的,所以这是我的最后一个问题(当天):我正在尝试让我的程序搜索文档。如果文档中的任何地方都有“不成功”字样,那么程序将搜索单词“error”并记录所有错误实例。但是,我很难让两者互相依赖。请帮忙!我对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" ;
    }

}
}
}
}

关闭文件; 关闭LOGFILE;

3 个答案:

答案 0 :(得分: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适用于不区分大小写的搜索,因此如果不需要,请将其从上面的代码中删除。

答案 1 :(得分: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;

答案 2 :(得分:0)

您在步骤1之前采取步骤5犯了严重错误。您未在代码中使用strictwarning pragma。实际上,您发布的代码无法编译。

对于有问题的问题,假设您只想解析每个文件一次(正如一个优秀的程序员应该努力做的那样),您应该分析两种模式:(1)unsuccessful具有的模式已被检测到,以及尚未检测到的模式。前者将具有输出线的作用,而后者则不会。

现在我建议回到一些基础知识,而不是提前采取措施。我自己过去多次在第1步之前采取了第5步,每次都是错误的。