“的Perl时间解析和差异计算”;加天数:小时:分钟”;

“的Perl时间解析和差异计算”;加天数:小时:分钟”;,perl,Perl,我有一个带有时差的字符串,如: 12:03:22 <- where ^ ^ ^ | | +minutes | +hours +days 我知道DateTime,但是解析输入字符串的简单方法是什么?我相信这里有一个更好的方法: use _usual_things_; my .... if($str =~ m/(.*):(.*):(.*)/) { $d = $1; $h = $2; $m = $3; } elsif( $str =~ m/(.*):(.*)/ ) {

我有一个带有时差的字符串,如:

12:03:22  <- where
 ^  ^  ^
 |  |  +minutes
 |  +hours
 +days
我知道DateTime,但是解析输入字符串的简单方法是什么?我相信这里有一个更好的方法:

use _usual_things_;
my ....
if($str =~ m/(.*):(.*):(.*)/) {
   $d = $1; $h = $2; $m = $3;
}
elsif( $str =~ m/(.*):(.*)/ ) {
   $h = $1; $m = $2;
} elsif ($str =~ m/\d+/ ) {
   $m = $1;
}
else {
  say "error";
}

如何将解析后的天、小时、分钟添加到当前日期中?

如何使用
反向操作来避免检查格式

my ($m, $h, $d) = reverse split /:/, $str;
要将其添加到当前日期,只需使用DateTime:

print DateTime->now->add(days    => $d // 0,
                         hours   => $h // 0,
                         minutes => $m);

解析可以一次完成,但无法避免基于toke数量的分支。下面是示例实现

$Str = '12:03:22' ;

@Values = ($Str=~/\G(\d\d):?/g) ;

print "error with input" if not @Values;

if( @Values == 3) { print "Have all 3 values\n" }
elsif( @Values == 2) { print "Have 2 values\n" }

太好了!:)3分钟后开始!:)唯一的缺陷是:当$d未定义时(例如,对于字符串2:30),DateTime会向DateTime::Duration::new抱怨'days'参数(未定义)是一个'undef',这不是允许的类型之一:OK,在添加中添加
//0
$d
$h
之后。(最新答复)
$Str = '12:03:22' ;

@Values = ($Str=~/\G(\d\d):?/g) ;

print "error with input" if not @Values;

if( @Values == 3) { print "Have all 3 values\n" }
elsif( @Values == 2) { print "Have 2 values\n" }