首先,您必须捕获您的输入:
my $time = "Fri 2013-06-14 0:59:15.3";
$time =~ /(\d+?):(\d+?):(.+)$/ #The time captured in three components
my $hours = $1;
my $minute = $2;
my $seconds = $3;
正则表达式描述了你想在你的行上匹配的内容。这$
意味着将我的表情固定在行尾。是(..)
捕获组。这些捕获在我的正则表达式中匹配的内容,并通过 、 和 变量使$1
它们$2
可用$3
。
如果您从未学习过正则表达式,那么您应该学习。正则表达式非常强大,您应该在上面的链接中阅读它们,或者尝试Perldoc 教程。
现在,我已经捕获了各种时间片段(假设 60 秒分钟和 60 分钟小时),我现在可以进行计算:
my $time_in_seconds = ( $hours * 3600 ) + ( $minutes * 60 ) + $seconds;
my $time_in_minutes = $time_in_seconds / 60;
计算机上的除法存在精度问题,因为很难表示以 2 为底的小数。因此,我更喜欢将其全部相乘,然后除以 60。
一旦你有时间,你需要以你想要的格式打印出来。这需要printf:
printf "%9.4f\n", $time_in_minutes;
%9.4f
指定格式。f
说这是一个浮点数(基本上是一个非整数)。4
代表小数位数。表示字段宽度,包括小数点、小数点另一侧的9
四位和减号。因此,这将允许高达 的宽度-9999.999
绰绰有余。
把它们放在一起......
#! /usr/bin/env perl
#
use warnings;
use strict;
use feature qw(say);
while ( my $time = <DATA> ) {
chomp $time;
$time =~ /(\d+?):(\d+?):(.+)$/; #The time captured in three components
my $hours = $1;
my $minutes = $2;
my $seconds = $3;
my $time_in_seconds = ( $hours * 3600 ) + ( $minutes * 60 ) + $seconds;
my $time_in_minutes = $time_in_seconds / 60;
printf qq(%9.4f\n), $time_in_minutes;
}
__DATA__
Fri 2013-06-14 0:59:15.3
Sat 2013-06-15 1:01:30.6
Sun 2013-06-16 1:03:45.9
现在运行它:
$ ./test.pl
59.2550
61.5100
63.7650
看起来是对的。