我有程序每5分钟打印一次最高间隔。我之前使用过相同的格式和另一个类似的数组,但这次我得到了一些错误:
在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
如何修复错误?谢谢你的帮助。
答案 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)=(“”,“”,“”,“”,“”,“”,“”, “”);