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の値の1つに3未満の ":"または "、"があります。

"sprintfでの初期化されていない値$yrの使用":@lastArrayの値の1つに6未満の ":"または "、"があります

PS-を取り除き$line =~ s/$/,/;ます。何の役にも立ちません。

于 2012-07-06T03:36:54.493 に答える
0

これらはエラーではなく、実際には警告です。使用警告を削除できます。(ただし、推奨されません)または変数を使用する前に初期化します。

ここで、これらの種類のエラーが表示されます。分割に $min と $yr をリストに入れる値がないなどの undef 値を割り当てている場合です。

したがって、これらの変数をどこで使用しても、警告がスローされます。

より安全な側にとどまるために、分割から値を割り当てる前に、これらの値をnullまたは好きなもので初期化できます。私のように ($dow, $mon, $day, $hr, $min, $sec, $yr, $amt) = ("","","","","","","", "");

于 2012-07-06T08:01:51.637 に答える