好的,所以这是我的最后一个问题(当天):我正在尝试让我的程序搜索文档。如果文档中的任何地方都有“不成功”字样,那么程序将搜索单词“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;
答案 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犯了严重错误。您未在代码中使用strict
和warning
pragma。实际上,您发布的代码无法编译。
对于有问题的问题,假设您只想解析每个文件一次(正如一个优秀的程序员应该努力做的那样),您应该分析两种模式:(1)unsuccessful
具有的模式已被检测到,以及尚未检测到的模式。前者将具有输出线的作用,而后者则不会。
现在我建议回到一些基础知识,而不是提前采取措施。我自己过去多次在第1步之前采取了第5步,每次都是错误的。