我想从文件中读取12小时格式时间并将其替换为24小时
例如
这是在凌晨3:15到期 - >这应该是15:15
我尝试在regex中保存变量并稍后进行manupilate但是没有工作,我也尝试使用替换" / s"但因为它是可变的我无法弄清楚
这是我的代码:
while (<>) {
my $line = $_;
print ("this is text before: $line \n");
if ($line =~ m/\d:\d{2}pm/g){
print "It is PM! \n";}
elsif ($line =~ m/(\d):(\d\d)am/g){
print "this is try: $line \n";
print "Its AM! \n";}
$line =~ s/($regexp)/<French>$lexicon{$1}<\/French>/g;
print "sample after : $line\n";
}
答案 0 :(得分:2)
一个简单的脚本可以为您完成工作
$str="this is due at 3:15pm";
$str=~m/\D+(\d+):\d+(.*)$/;
$hour=($2 eq "am")? ( ($1 == 12 )? 0 : $1 ) : ($1 == 12 ) ? $1 :$1+12;
$min=$2;
$str=~s/at.*/$hour:$min/g;
print "$str\n";
输出为
this is due 15:15
它的作用??
$str=~m/\D+(\d+):(\d+)(.*)$/;
尝试将字符串与正则表达式匹配
\D+
匹配除数字以外的任何内容。在这里它匹配this is due at
(\d+)
匹配任意数量的数字。在这里它匹配3
。在第1组捕获,$1
这是小时
:
匹配:
(\d+)
匹配任意数量的数字。这里它匹配15
,这是分钟
(.*)
匹配以下任何内容,am
。第2组捕获,“$ 2
$
将正则表达式锚定在
$hour=($2 eq "am")? ( ($1 == 12 )? 0 : $1 ) : ($1 == 12 ) ? $1 :$1+12;
转换为24小时制。如果$2
pm
12
添加12
,除非它是am
。如果时间是12
和0
,那么小时为$str=~s/at.*/$hour:$min/g;
at
将$hour:$min
中的任何内容替换为{{1}}的字符串结尾,这是从
答案 1 :(得分:1)
#!/usr/bin/env perl
use strict;
use warnings;
my $values = time_12h_to_24h("11:00 PM");
sub time_12h_to_24h
{
my($t12) = @_;
my($hh,$mm,$ampm) = $t12 =~ m/^(\d\d?):(\d\d?)\s*([AP]M?)/i;
$hh = ($hh % 12) + (($ampm =~ m/AM?/i) ? 0 : 12);
return sprintf("%.2d:%.2d", $hh, $mm);
}
我在下面的链接中找到了这段代码。请检查: Is my pseudo code for changing time format correct?
答案 2 :(得分:0)
尝试这样做可以满足您的期望
my @data = <DATA>;
foreach my $sm(@data){
if($sm =~/(12)\.\d+(pm)/g){
print "$&\n";
}
elsif($sm =~m/(\d+(\.)?\d+)(pm)/g )
{
print $1+12,"\n";
}
}
__DATA__
Time 3.15am
Time 3.16pm
Time 5.17pm
Time 1.11am
Time 1.01pm
Time 12.11pm