Regex perl if-then-else逻辑以及如果正则表达式不';不匹配

Regex perl if-then-else逻辑以及如果正则表达式不';不匹配,regex,perl,if-statement,regex-negation,Regex,Perl,If Statement,Regex Negation,到目前为止,我有一些工作代码进入服务器列表,并执行一些正则表达式从日志文件中获取数据。我想做的是,如果在特定服务器上没有要从正则表达式捕获的数据,则弹出一个状态“此服务器无需报告” 现在,它通过每台服务器,如果数据与正则表达式匹配,就会打印出来。 我添加了一个else语句来打印出上面的语句来处理这个问题,但是现在它会打印出每个不匹配的实例 这是我添加更改之前的输出副本,它现在可以工作了 =======================================================

到目前为止,我有一些工作代码进入服务器列表,并执行一些正则表达式从日志文件中获取数据。我想做的是,如果在特定服务器上没有要从正则表达式捕获的数据,则弹出一个状态“此服务器无需报告”

现在,它通过每台服务器,如果数据与正则表达式匹配,就会打印出来。 我添加了一个else语句来打印出上面的语句来处理这个问题,但是现在它会打印出每个不匹配的实例

这是我添加更改之前的输出副本,它现在可以工作了

========================================================================
REPORTING SUMMARY for BACKUP SERVER : hostname1
========================================================================
REPORTING SUMMARY for BACKUP SERVER : hostname2
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: backup-date=20100705003002
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: host=hostname2
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-size=49.75 GB
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-time=00:25:23
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-status=Backup succeeded
========================================================================
这是现在输出的副本,在我添加了“此日期无需报告的内容”之后(在while循环中)。基本上,每次不匹配的时候都会打印出来。我真的只想让它给我一个陈述

========================================================================
REPORTING SUMMARY for BACKUP SERVER : hostname1
NOTHING TO REPORT FOR THIS DATE... 
NOTHING TO REPORT FOR THIS DATE... 
NOTHING TO REPORT FOR THIS DATE... 
...
...
========================================================================
NOTHING TO REPORT FOR THIS DATE... 
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: backup-date=20100705003002
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: host=hostname2 
NOTHING TO REPORT FOR THIS DATE... 
NOTHING TO REPORT FOR THIS DATE...
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-size=49.75 GB
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-time=00:25:23
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-status=Backup succeeded
代码如下:

# Usage: ./test.pl Ju1 05 2010 <logfilepath> hostname1 hostname2 hostname3
use strict;
use warnings;
my($mon,$day,$year,$file) = @ARGV;
splice(@ARGV, 0, 4, ());            
foreach my $server ( @ARGV ) {      
    print "========================================================================\n";
    print "REPORTING SUMMARY for BACKUP SERVER : $server\n";
    open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
    while (my $line = <$fh>) {
        if ($line =~ m/.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(host=|ERROR:|backup-date=|backup-size=|backup-time=|backup-status)/) {
            print $line;
            # adding else statement here
            } else {
            print "NOTHING TO REPORT FOR THIS DATE... \n";
        }
    }
    close($fh);
}
#用法:./test.pl Ju1 05 2010主机名1主机名2主机名3
严格使用;
使用警告;
我的($mon,$day,$year,$file)=@ARGV;
拼接(@ARGV,0,4,());
foreach my$server(@ARGV){
打印“===================================================================================================================\n”;
打印“备份服务器的报告摘要:$SERVER\n”;
打开(my$fh,“ssh$server cat$file |”)或死亡“无法打开日志$server:$file:$!\n”;
while(我的$line=){
如果($line=~m/*$mon$day\d{2}:\d{2}:\d{2}$year:.*(主机=|错误:|备份日期=|备份大小=|备份时间=|备份状态)/){
打印$行;
#在此处添加else语句
}否则{
打印“此日期无需报告…\n”;
}
}
收盘价($fh);
}
  • 将布尔值设置为false
  • 在while循环中,如果正则表达式匹配,则将布尔值设置为true
  • 在while循环之外,如果布尔值仍然为false,则不打印任何要报告的内容

  • 我不认为,我做对了。我按照建议(@mcandre)进行了尝试,并将其置于while循环之外,但仍然得到了相同的行为。我应该把这张支票放在哪里

    use strict;
    use warnings;
    my($mon,$day,$year,$file) = @ARGV;
    my $boolean = 0;
    splice(@ARGV, 0, 4, ());            
    foreach my $server ( @ARGV ) {      
        print "========================================================================\n";
        print "REPORTING SUMMARY for BACKUP SERVER : $server\n"; 
        open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
        while (my $line = <$fh>) {
            if ($line =~ m/.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(host=|ERROR:|backup-date=|backup-size=|backup-time=|backup-status)/) {
                print $line;
                $boolean=1; #set to true
                #print "Boolean is set to $boolean \n";
            }
        } #end while loop
            if ($boolean=0) {
               print "Boolean is set to $boolean \n";
               print "NOTHING TO REPORT FOR THIS DATE... \n";
            }
        close($fh);
    }
    
    使用严格;
    使用警告;
    我的($mon,$day,$year,$file)=@ARGV;
    我的$boolean=0;
    拼接(@ARGV,0,4,());
    foreach my$server(@ARGV){
    打印“===================================================================================================================\n”;
    打印“备份服务器的报告摘要:$SERVER\n”;
    打开(my$fh,“ssh$server cat$file |”)或死亡“无法打开日志$server:$file:$!\n”;
    while(我的$line=){
    如果($line=~m/*$mon$day\d{2}:\d{2}:\d{2}$year:.*(主机=|错误:|备份日期=|备份大小=|备份时间=|备份状态)/){
    打印$行;
    $boolean=1;#设置为true
    #打印“布尔值设置为$Boolean\n”;
    }
    }#边结束边循环
    如果($boolean=0){
    打印“布尔值设置为$Boolean\n”;
    打印“此日期无需报告…\n”;
    }
    收盘价($fh);
    }
    
    现在可以使用:

    use strict;
    use warnings;
    my($mon,$day,$year,$file) = @ARGV;
    my $has_data = 0;
    splice(@ARGV, 0, 4, ());            
    foreach my $server ( @ARGV ) {     
        print "========================================================================\n";
        print "REPORTING SUMMARY for BACKUP SERVER : $server\n";
        open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
        while (my $line = <$fh>) {
            if ($line =~ m/.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(host=|ERROR:|backup-date=|backup-size=|backup-time=|backup-status)/) {
                print $line;
                $has_data=1; #set to true
                #print "Boolean is set to $has_data \n";
            }
        } #end while loop
            if ($has_data==0) {
               print "Boolean is set to $has_data \n";
               print "NOTHING TO REPORT FOR THIS DATE... \n";
            }
           $has_data=0;
           print "Boolean is reset to $has_data \n";
        close($fh);
    }
    
    使用严格;
    使用警告;
    我的($mon,$day,$year,$file)=@ARGV;
    my$has_data=0;
    拼接(@ARGV,0,4,());
    foreach my$server(@ARGV){
    打印“===================================================================================================================\n”;
    打印“备份服务器的报告摘要:$SERVER\n”;
    打开(my$fh,“ssh$server cat$file |”)或死亡“无法打开日志$server:$file:$!\n”;
    while(我的$line=){
    如果($line=~m/*$mon$day\d{2}:\d{2}:\d{2}$year:.*(主机=|错误:|备份日期=|备份大小=|备份时间=|备份状态)/){
    打印$行;
    $has_data=1;#设置为true
    #打印“布尔值设置为$has\u data\n”;
    }
    }#边结束边循环
    如果($has_data==0){
    打印“布尔值设置为$has\u data\n”;
    打印“此日期无需报告…\n”;
    }
    $has_data=0;
    打印“布尔值重置为$has\u data\n”;
    收盘价($fh);
    }
    
    Woah,这本书很值得一读。我想你的意思是说,“给我一些Perl代码,如果没有一行与正则表达式匹配,那么就不会打印任何要报告的内容。”为什么不使用Perl“格式”编程?至少,这真的适用于此类任务。在格式方面,我需要什么?你是说使用printf吗?谢谢。@jaedre619,我相信@Pmod指的是perl的格式和编写语句:@jaedre619:In
    如果($boolean=0)
    ,则将0赋值给
    $boolean
    。如果($boolean==0),则需要
    。您还可能希望在
    foreach
    循环内将
    $boolean
    重置回0。另外,您应该将
    $boolean
    重命名为有意义的名称,例如
    $has_data
    。此外,您正在使用strict和warnings,因此在编译和运行它时应该看到类似的内容:
    Found=in conditional,should==at…
    。不要忽视这些警告,它们会告诉你出了什么问题。@indiv:谢谢!!它知道的工作,因为我想它太…而且,我并没有忽视警告。我会尽力解决这个问题。谢谢。谢谢你帮我处理这个逻辑。我一直使用这个模式:)你不需要重置
    $has\u data=0最后,由于您不再使用它,如果您可以
    undef$的任何内容都有\u数据
    。另外,
    if($has\u data==0)
    也可以变成
    if($has\u data)