我需要使用perl从文本文件DOW YYYY-MM-DD H:MM:SS.S读入,然后输出小数分钟MM.MMMM。给定输入文本文件
Fri 2013-06-14 0:59:15.3
Sat 2013-06-15 1:01:30.6
Sun 2013-06-16 1:03:45.9
我想计算小数分钟值
(60*0)+59+(15.3/60) = 59.2550
(60*1)+01+(30.6/60) = 61.5100
(60*1)+03+(45.6/60) = 63.7600
然后输出
(59.2550, 61.5100, 63.7600)
答案 0 :(得分:3)
假设文本文件中的每一行都是它自己的日期,并且您正在读取的文件位于同一目录中并且名为input.txt
,我会这样做:
use strict;
use warnings;
my @result = ();
{
open (my $file, "<", "input.txt") or die "cannot open < input.txt: $!";
while(<$file>){
my @current = split(/:/,substr($_,15));
push(@result, (60*$current[0]) + $current[1] + ($current[2]/60));
}
}
print "(" . join(',',@result) . ")";
答案 1 :(得分:3)
输入文件的格式不是很清楚,但这似乎产生了你想要的。它期望输入文件的路径作为命令行参数。
use strict;
use warnings;
my @minutes;
while (<>) {
push @minutes, $1*60 + $2 + $3/60 if /(\d+):(\d+):([\d.]+)/;
}
printf "(%s)\n", join ', ', map sprintf('%.4f', $_), @minutes;
<强>输出强>
(59.2550, 61.5100, 63.7650)
答案 2 :(得分:0)
首先,您必须捕获您的输入:
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;
regular expression描述了您想要在线上匹配的内容。 $
表示将我的表达式锚定在该行的末尾。 (..)
是捕获组。这些内容会捕获我的正则表达式中匹配的内容,并通过$1
,$2
和$3
变量提供这些内容。
如果你从未学过正则表达式,那么你应该这样做。正则表达式非常强大,您应该在上面的链接中阅读它们,或者尝试Perldoc tutorial。
现在,我已经捕获了各种各样的时间(假设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
看起来正确。