我有时间(仅在几小时和几分钟内)在一个文本文件中定义并从机器获取当前时间。下面是我的代码,我的垃圾值为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;
}
答案 0 :(得分:1)
对perl进行问题排查的第1步:启用use strict;
和use warnings
:
$SLAtime
但您没有定义或声明它。$timefromfile
但没有;
,因此无法编译。 @t
中减去一个值。由于上述原因,该值未定义,因为您没有strict
或warnings
只是静默评估为零。 @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"
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";
注意!我将文件中的时间作为硬编码常量输入,以便上面的代码可以运行。你需要做出相应的调整。