我希望以这种格式“D天,h:mm:ss”(或“h:mm:ss”)设备正常运行,如果设备不超过一天,但我可以设定如何检查那)
我的问题是例如如何从字符串中提取d
,h
,mm
和ss
以便我可以使用它进行计算(使用DateTime,我在这里也找到了)
答案 0 :(得分:2)
这可以通过一个带有一些捕获组的简单正则表达式来解决。
这需要花费一段时间,格式为" d天,h:mm:ss"并会给你几天,几小时,几分钟和几秒钟。
#!/usr/bin/perl
use strict;
use warnings;
# Define a random time
my $time = '4 days, 03:44:23';
# Extract the data from the time
my ($days, $h, $m, $s) = $time =~ m/([0-9]+)\sdays,\s([0-9]+):([0-9]+):([0-9]+)/;
# Print the output
print 'time: '.$time."\n\n";
print 'days: '.$days."\n";
print 'h : '.$h."\n";
print 'm : '.$m."\n";
print 's : '.$s."\n";
有关如何使用正则表达式的更多信息,您可能会发现这有用:perlre (regular expression tutorial)
此外,由于您是Perl的新用户,我将补充说,您应该始终在代码顶部添加use strict;
和use warnings;
。它会阻止你犯下愚蠢的错误(例如尝试使用未定义的变量)并为你节省很多麻烦。
您还可以通过将匹配放在if
语句中来验证您是否拥有良好的数据。养成这样做的习惯很好。
my ($days, $h, $m, $s);
if ($time =~ m/([0-9]+)\sdays,\s([0-9]+):([0-9]+):([0-9]+)/) {
($days, $h, $m, $s) = ($1, $2, $3, $4)
}
else {
die "Invalid date format encountered!";
}
答案 1 :(得分:2)
由于这看起来像是一个受教育的时刻,我将添加tjwrona1992的正则表达式
my ($days, $h, $m, $s) = $time =~ m/([0-9]+)\sdays,\s([0-9]+):([0-9]+):([0-9]+)/;
可以使用/ x修饰符编写,以允许空格和注释使其更容易被人类消费者消化:
my ($days, $h, $m, $s) = $time =~ m/
([0-9]+) \s days, # $1 will be days
\s
([0-9]+) : # $2 = hours
([0-9]+) : # $3 = minutes
([0-9]+) # $4 = seconds
/x or die "the regex did not match '$time'";