在计算已定义和当前时间之间的差异时获取垃圾值(perl脚本)

时间:2018-01-19 13:07:09

标签: perl

我有时间(仅在几小时和几分钟内)在一个文本文件中定义并从机器获取当前时间。下面是我的代码,我的垃圾值为3. perl脚本中的代码。文本文件中的数据如下:

                   ##ID::name::time
                   228::one::18 30 30
                   97::two::20 30 00

代码如下:请建议。

         my $timefromfile;
    open(my $fh, "<", $paramfile) or die("Can't open $paramfile\n") ;
        {
        print "before while\n";
    while (my $line = <$fh>) {
        print "$line\n";
        if($line !~ m/^\#/){
            chomp($line);
        #if line isn't blank, process it
            if($line ne ""){
                push(@all_linesSettings, $line);
                my @lineseparator = split(/\::/, $line);
                $timefromfile = $lineseparator[-1];
                my $namefromfile = $lineseparator[-2];
                my $IDfromfile = $lineseparator[-3]; 
                print "File Time for $IDfromfile $namefromfile is 
                    $timefromfile \n";

                print "**********\n";   
                (my $sec,my $min,my $hour) = localtime();
                printf("Current Time is in - HH:MM:SS format  ");
                #get time into a variable
                my @t;
                @t = ($hour, $min, $sec);           
                print "\n@t\n";
                print "\n**********\n";

                my $format = '%H %M %S';
                my $diff = @t - Time::Piece->strptime($timefromfile, $format );
                print "\n now slatime is $timefromfile\n";
                print  "difference in seconds $diff\n";
            }
        }
            }
        }
            close $fh;
            }

3 个答案:

答案 0 :(得分:1)

对perl进行问题排查的第1步:启用use strict;use warnings

  • 您尝试解析$SLAtime但您没有定义或声明它。
  • 您声明$timefromfile但没有;,因此无法编译。
  • 你的缩进被打破了。 (你的括号不匹配)。
  • 您从@t中减去一个值。由于上述原因,该值未定义,因为您没有strictwarnings只是静默评估为零。 @t包含3个元素,这就是它在标量上下文中的计算方式。那可能就是你3的来源。
  • 你有一个printf混合,没有格式字符串或变量。这有点奇怪。
  • 目前还不清楚你是否首先加载Time::Piece。这使得它使用起来相当困难。
  • Time::Piece->strptime使用纪元作为基线。你比较1970年1月1日,所以你的delta会比你想象的要大得多。

类似的东西:

#!/usr/bin/env perl

use strict;
use warnings;
use Time::Piece;

while (<DATA>) {
   print;
   unless (m/^\s*\#/) {
      chomp;
      my ( $ID, $name, $timestr ) = split /::/;
      my $now = localtime;

#note - this assumes time stamps are from today, which may not be what you want.
      my $converted_time = Time::Piece->strptime(
         join( " ", $timestr, $now->year, $now->mon, $now->mday ),
         '%H %M %S %Y %m %d' );

      my $diff = $converted_time - $now;

      print "Diff is: $diff s\n";


   }
}


__DATA__
##ID::name::time
228::one::18 30 30
97::two::20 30 00

让你更近一点。

答案 1 :(得分:1)

my $diff = @t - Time::Piece->strptime($SLAtime, $format );

我猜你希望这会做成对减法吗? (即,减去每个列表中的第一项,然后减去第二项,然后减去第三项。)

没有。

它在标量上下文中计算每个操作数,然后减去这些标量。如果其中一个标量是一个字符串,它将首先被强制转换为数字。

在标量上下文中计算数组时,结果是数组中的项数。

所以:

  • 您从@t - Time::Piece->strptime($SLAtime, $format )
  • 开始
  • @t是一个包含三个项目的数组,strptime是一个字符串,类似于“1943年11月3日星期日”(来自Time::Piece文档的示例;我不喜欢不知道你的$format看起来是什么样的,所以减法变为3 - "Sunday 3rd Nov, 1943"
  • “1943年11月3日星期日”并非以数字开头,因此其数字值为0,使您的减法3 - 0
  • 因此,您总是得到3作为结果。

如果要正确减去日期和/或时间,请查看DateTime模块,其中包括执行日期算术的方法。

答案 2 :(得分:1)

您正试图从数组中减去Time::Piece个对象,但该对象无法正常工作。

您需要将当前时间转换为Time::Piece对象,然后减去它们将返回Time::Seconds对象,如下所示:

use Time::Piece;
use Time::Seconds;
my $current_time = Time::Piece->localtime();
my $timefromfile="2018-01-17 18 30 30";
my $format = "%Y-%m-%d %H %M %S";
my $diff = $current_time - Time::Piece->strptime($timefromfile, $format);
print "Difference in seconds is ", $diff->seconds(), "\n";

您还需要将日期提供给strptime命令。如果您知道日期总是在今天(并在午夜时分注意),那么您可以这样做:

my $timefromfile = $current_time->ymd() . " 18 30 30";

注意!我将文件中的时间作为硬编码常量输入,以便上面的代码可以运行。你需要做出相应的调整。