全球替代

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:00AM, , 1, 0, 2003 年 2 月 2 日 12:00PM

输出:

2007-05-15 00:00:00, , 1, 0, 2003 年 2 月 2 日 12:00PM

您正在替换与该行的第一个日期时间相同的所有日期时间。您甚至不会尝试查找任何其他日期时间。

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

    print;
}

事实证明,您为问题选择的主题非常合适:)


注意:我将 %H(小时为 0..23)更改为比 %I(小时为 1..12)更合适。