未初始化的值错误

时间:2012-07-06 03:00:46

标签: perl

我有程序每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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

如果你要为它们分配undef值,就会显示这些类型的错误,就像split没有值放入$ min和$ yr列表中一样。

因此,只要您使用这些变量,就会发出警告。

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