2

我有每 5 分钟打印一次最高间隔的程序。我以前曾将这种相同的格式与另一个类似的数组一起使用,但这次我遇到了一些错误:

  • 在除法中使用未初始化的值 $min ...
  • 在 sprintf 中使用未初始化的值 $yr ...
  • 在 sprintf 中使用未初始化的值...

    use strict;
    use warnings;
    use Text::CSV_XS;
    
    my %interval; 
    my %month; @month{qw/ jan feb mar apr may jun jul aug sep oct nov dec /} = '01' .. '12';  
    
    foreach my $line (@lastArray){          
            $line =~ s/$/,/;
            my ($dow, $mon, $day, $hr, $min, $sec, $yr, $amt) = split /[:,]/, $line;   
            my $key = sprintf "%4d-%02d-%02d %02d:%02d",                 
                $yr, $month{lc $mon}, $day, $hr, int($min / 5) * 5;      
                if (exists $interval{$key}) {         
                    if ($interval{$key}{amt} > $amt) {             
                        $interval{$key}{amt} = $amt;             
                        $interval{$key}{data} = [split ",", $line];         
                    }     
                }     
                else { # first time in this 5 minute interval         
                $interval{$key}{amt} = $amt;         
                $interval{$key}{data} = [split ",", $line];     
                }
        }   
        my $csv = Text::CSV_XS->new ({ binary => 1 }) or die "Cannot use CSV: ".Text::CSV_XS->error_diag ();  
        $csv->eol("\n");
    
        # Initialize CSV files  
        open my $fh, ">", 'log_5min.csv' or die $!;  
        open my $FILE, ">", 'last_5min.stat' or die $!;
    
        # Print Max Busy for all intervals
        print $fh "DayofWeek,Month,Day,Time,Year,rdy,bsy,rd,wr,ka,log,dns,cls\n";
        for my $time (sort keys %interval) {   
            $csv->print($fh, $interval{$time}{data}); 
        }  
    

数组 @lastArray 包含以下内容:

Wed,Jun,13,01:00:29,2012,777,23,0,15,6,0,0,2,15,0,0
Wed,Jun,13,01:01:29,2012,782,18,0,14,3,0,0,1,14,0,0
Wed,Jun,13,01:02:29,2012,787,13,0,10,3,0,0,0,10,0,0
Wed,Jun,13,01:03:29,2012,782,18,0,15,2,0,0,1,15,0,0
Wed,Jun,13,01:04:29,2012,779,21,0,12,9,0,0,0,12,0,0
Wed,Jun,13,01:05:30,2012,777,23,0,18,5,0,0,0,18,0,0
Wed,Jun,13,01:06:30,2012,783,17,0,10,4,0,0,3,10,0,0
Wed,Jun,13,01:07:30,2012,786,14,0,6,5,0,0,3,6,0,0
Wed,Jun,13,01:08:30,2012,789,11,0,6,5,0,0,0,6,0,0

如何修复错误?感谢您的帮助。

4

2 回答 2

1

“在除法中使用未初始化的值 $min”:@lastArray 中的值之一的“:”或“,”少于 3 个。

“在 sprintf 中使用未初始化的值 $yr”:@lastArray 中的值之一少于 6 个“:”或“,”

等等

PS-摆脱$line =~ s/$/,/;。它没有做任何有用的事情。

于 2012-07-06T03:36:54.493 回答
0

这些不是错误,实际上这些是警告。您可以删除使用警告;(虽然不是首选)或在使用之前初始化任何变量。

这里将显示这些类型的错误,如果您为它们分配 undef 值,例如 split 没有值可以放入 $min 和 $yr 列表中。

所以无论你在哪里使用这些变量,它都会抛出警告。

为了保持更安全的一面,您可以在从拆分分配值之前使用 null 或任何您喜欢的值初始化这些值。像我的 ($dow, $mon, $day, $hr, $min, $sec, $yr, $amt) = ("","","","","","","", "");

于 2012-07-06T08:01:51.637 回答