my $path="/mnt/splash/logs/";
my $serv= sprintf("splash-%s-%02d%02d%02d-%s",$server,$year,$mon,$date,$hourStart);
my $eserv= sprintf("splash-%s-%02d%02d%02d-%s",$server,$eyear,$emon,$edate,$hourEnd);
print $serv;
print $eserv;
#OPEN THE SPLASH LOGS DIRECTORY AND READ THE FILES PRESENT THEN STORE IT IN ARRAY.
my $remote_dir=sprintf("ssh %s 'ls %s'",$server,$path);
chomp $remote_dir;
my @list=`$remote_dir`;
#FINDING THE ONLY SPLASH LOGS FILES FROM THE DIRECTORY AND STORED IN AN ARRAY USING PUSH METHOD.
my @srt_list= sort @list;
my @arlist=();
my @arrlog=();
my $i=0;
my $filt;
for(@srt_list) {
if ($_ ge $serv && $_ le $eserv) {
#my $filter= sprintf("$_\n");
chomp $_;
push (@arrlog, $_);
}
}
上面是我用来从数组中检索日志的perl代码。我在if
和ge
运算符中使用了le
条件,但如果我在20160628-0400.log到20160629-1000.log之间搜索日志文件,则此代码将显示20160628的日志-0400.log到20160629-0900.log这不是检索结束时间日志即时搜索的日志20160629-1000.log。我不知道这是怎么发生的我使用了le运算符,这意味着它应该选择小于或等于log log的日志?
请澄清一下。我真的不想添加任何其他检查来检索结束时间日志。
答案 0 :(得分:3)
如果没有看到您的输入数据,我将不得不猜测。
但是从你所拥有的,我猜你正在比较:
带有20160629-1000
的 20160629-1000.log
末尾的后缀使其按字母顺序“更大”。
print "yes" if "20160629-1000" le "20160629-1000.log";
print "no" if "20160629-1000.log" le "20160629-1000";
那是因为le
是字符串比较,而不是数字比较。
简单的解决方法是剥去后缀:
for (@srt_list) {
my ($compare) = m/(splash.*[\d\-]+)\.log/;
print "Comparing $compare with $serv and $eserv\n";
if ($compare ge $serv && $compare le $eserv) {
chomp $_;
push (@arrlog, $_);
}
}