Perl使用心得:2005到2006年引发的程序问题
时间:2006-03-01 来源:xiaoquqi
今天忽然发现kpi的告警程序运行起来超级慢,经过仔细分析发现是由于时间问题导致的。
unix平台下,ls -lrt命令只能显示出月、日,小时:分钟,对于过早的文件才会在日期处显示成年,以前的程序忽略了跨年显示的情况,导致程序把去年的文件也当作符合时间点的文件进行分析了,从而影响了程序的效率。
新程序的思路如下:
将ls -lrt返回的文件列表进行分析,把月、日、小时:分钟,再定义一个存放文件年的变量,分别放在单独的一个变量里,然后取出系统当前时间,与月进行比较后如果发现文件的月大于当前系统时间的月,那么文件的年的变量就应该为系统年-1。程序部分代码如下:
sub anaylze_file_list
{
my $doorDate=shift;
my ($lscmd,$fhd,$fileMon,$fileDay,$fileTime,$fileName,$filelist,$fileDate,$fileYear);
my (@lscmd,@filename);
$lscmd="ls -lrt ".%config->{"LogPath"}."|awk '{print \$6\" \"\$7\" \"\$8\" \"\$9}'";
@lscmd=`$lscmd`;
if(@lscmd==0){print("No Pattern File");exit 0;}
foreach $fhd (@lscmd){
chomp($fhd);
@filename=split(/\s+/,$fhd); #Month of File
$fileMon=$filename[0];
$fileMon = $namemonth{$fileMon};
$fileMon = sprintf("%0.2d",$fileMon); #Day of File
$fileDay=$filename[1];
$fileDay = sprintf ("%0.2d",$fileDay); #Time of file
$fileTime=$filename[2]; #Name of File
$fileName=$filename[3]; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
if($fileTime=~/^(\d\d\d\d)$/){
$fileDate=$1.$fileMon.$fileDay."000000";
}else{
$fileTime=~s/\://g;
$mon = sprintf("%0.2d",$mon+1);
if($mon<$fileMon){$fileYear=$year+1900-1;}else{$fileYear=$year+1900;}
$fileDate=$fileYear.$fileMon.$fileDay.$fileTime."00";
}
if($fileDate<$doorDate){next;} if($filelist eq ''){
$filelist=$fileName;
}else{
$filelist=$filelist.",".$fileName;
}
}
return $filelist;
}
{
my $doorDate=shift;
my ($lscmd,$fhd,$fileMon,$fileDay,$fileTime,$fileName,$filelist,$fileDate,$fileYear);
my (@lscmd,@filename);
$lscmd="ls -lrt ".%config->{"LogPath"}."|awk '{print \$6\" \"\$7\" \"\$8\" \"\$9}'";
@lscmd=`$lscmd`;
if(@lscmd==0){print("No Pattern File");exit 0;}
foreach $fhd (@lscmd){
chomp($fhd);
@filename=split(/\s+/,$fhd); #Month of File
$fileMon=$filename[0];
$fileMon = $namemonth{$fileMon};
$fileMon = sprintf("%0.2d",$fileMon); #Day of File
$fileDay=$filename[1];
$fileDay = sprintf ("%0.2d",$fileDay); #Time of file
$fileTime=$filename[2]; #Name of File
$fileName=$filename[3]; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
if($fileTime=~/^(\d\d\d\d)$/){
$fileDate=$1.$fileMon.$fileDay."000000";
}else{
$fileTime=~s/\://g;
$mon = sprintf("%0.2d",$mon+1);
if($mon<$fileMon){$fileYear=$year+1900-1;}else{$fileYear=$year+1900;}
$fileDate=$fileYear.$fileMon.$fileDay.$fileTime."00";
}
if($fileDate<$doorDate){next;} if($filelist eq ''){
$filelist=$fileName;
}else{
$filelist=$filelist.",".$fileName;
}
}
return $filelist;
}
相关阅读 更多 +
排行榜 更多 +