全球替代

时间:2016-07-26 15:21:08

标签: perl global 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

1 个答案:

答案 0 :(得分: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)。