"小于或等于"如果条件,操作员不工作

时间:2016-06-30 05:18:08

标签: linux perl if-statement

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代码。我在ifge运算符中使用了le条件,但如果我在20160628-0400.log到20160629-1000.log之间搜索日志文件,则此代码将显示20160628的日志-0400.log到20160629-0900.log这不是检索结束时间日志即时搜索的日志20160629-1000.log。我不知道这是怎么发生的我使用了le运算符,这意味着它应该选择小于或等于log log的日志?

请澄清一下。我真的不想添加任何其他检查来检索结束时间日志。

1 个答案:

答案 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, $_);
    }
}