我正在以这种格式12/Jul/2016:13:26:23
获得时间。
现在我希望得到时间13Hour 26Min and 23Seconds
。
我们如何通过正则表达式在Perl中执行此操作?我试过这个,但我无法做到这一点
$line =~ /^.+?\:(.+)/
请帮我解决这个问题。
答案 0 :(得分:2)
您已经运行良好的正则表达式解决方案,但仅供比较,我将如何使用Time::Piece。
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Time::Piece;
my $date_str = '12/Jul/2016:13:26:23';
my $date_fmt = '%d/%b/%Y:%H:%M:%S';
my $date = Time::Piece->strptime($date_str, $date_fmt);
say $date->hour, ' hours, ', $date->minute, ' minutes, ',
$date->second, ' seconds';
答案 1 :(得分:1)
有许多最优秀的日期时间模块,但鉴于不寻常的输出格式和简单输入,也许正则表达式是一个很好的解决方案。
my ($day, $mon, $year, $hour, $minute, $sec) =
$line =~ m|(\d+)/([^/]+)/(\d{4}):(\d{2}):(\d{2}):(\d{2})|;
现在可以随意打印出来。
或者,可以在输入字符串的相关部分中使用:
分隔符
my @hms = $line =~ m/:(\d+)/g;
print "@hms\n";
使用问题中的字符串打印13 26 23
。这会通过/g
修饰符重复捕获跟随冒号的所有连续数字。
所以@hms
包含:小时,分钟,秒。
答案 2 :(得分:0)
这应该做的工作:
$line =~ /\d+\/\w+\/\d{4}:(\d+):(\d+):(\d+)/
$ 1包含小时数 2分钟和3秒钟
答案 3 :(得分:0)
执行此操作的最简单方法之一是扫描日期时间字符串以查找“单词”字符序列,其中包括所有数字和字母以及下划线字符。这将返回所有字段的值,你可以用它们做什么
use strict;
use warnings 'all';
my $dt = '12/Jul/2016:13:26:23';
my ($day, $mon, $year, $h, $m, $s) = $dt =~ /\w+/g;
printf "%dHour %dMin and %dSeconds.\n", $h, $m, $s;
13Hour 26Min and 23Seconds.