2016-07-26 50 views
0

嗨我正在使用下面的代码来替换日期格式,但我无法弄清楚如何全局更改所有日期。目前,该脚本正确地找到并替换了日期,但它仅对一行中找到的第一个日期执行,但跳过该行的其余部分。因此,如果在同一行内需要更改另一个日期,它将忽略它。我试图使用全球替代,但无济于事。如果有人能给我一个想法,我会非常感激。全球Substitution

use strict; 
use Time::Piece(); 

my $file = $ARGV[0]; 
open FILE, $file or die; 


while (my $line = <FILE>) { 
chomp $line; 
my ($date) = $line =~ m/([A-Z][a-z][a-z] [ \d]{2} \d{4} \d{2}:\d{2}[AP]M)/; 

      if ($date eq ''){ 
        print "$line\n"; 
        next; 
      } 
     my $new_dt = Time::Piece->strptime($date, '%b %d %Y %H:%M%p')->strftime('%Y-%m-%d %H:%M:%S'); 

     $line =~ s/$date/$new_dt/g; 
     print "$line\n"; 
} 

close FILE; 
print "\n"; 

编辑:添加例子

输入:2007

5月15日上午12:00,1,0,2003年2月2日下午12:00

输出:

2007 -05-15 00:00:00,1,0,Feb 2 2003 12:00 PM

+0

你能提供一个样本输入和输出吗? –

+1

迭代用'm // g'找到的匹配。 – syck

回答

4

您正在更换所有的日期时间是我牙齿的第一个日期时间的线。你甚至不试图找到其他的日期。

while (<>) { 
    s{([A-Z][a-z][a-z] [ \d]\d \d{4} \d{2}:\d{2}[AP]M)}{ 
     Time::Piece->strptime($1, '%b %d %Y %I:%M%p')->strftime('%Y-%m-%d %H:%M:%S') 
    }eg; 

    print; 
} 

事实证明,你选择了你的问题的主题是比较合适:)


注:我改变%H(每小时0..23),以更合适的比%I (小时为1..12)。

+0

那么根据我的文本文件的输出,它将单独替换每行的日期时间,除非它忽略该行中第一个日期时间之后的任何内容。现在就给你的代码一个镜头!谢谢。 编辑:像魅力的工作谢谢你好先生! – Gary

+0

不完全。正如我所说的,“你将所有**的**日期时间替换为与该行的第一个日期时间相同的**。”如果您有'2007年5月15日上午12:00 ... ... 2007年5月15日12:00',则两者都将被替换。其他日期不会被取代,因为你甚至没有找到它们。 – ikegami

+0

呃谢谢你的澄清!非常感激。并且非常感谢,我不知道你可以在替代语法中使用time :: piece模块。 – Gary