2016-07-26 7 views
0

Привет, Я использую приведенный ниже код для замены форматов даты, но я не могу понять, как глобально изменить все даты. В настоящее время скрипт находит и заменяет даты правильно, но он делает это только для первой даты, найденной внутри строки, но пропускает остальную часть этой строки. Поэтому, если в той же строке есть другая дата, которая должна быть изменена, она игнорирует ее. Я попытался использовать глобальную замену, но безрезультатно. Если бы кто-нибудь мог дать мне представление, я бы очень это оценил.Глобальная подстановка

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"; 

EDIT: Добавлен пример

Вход:

15 мая 2007 12:00 утра,, 1, 0, 2 февраля 2003 12:00 вечера

Выход:

2007 -05-15 00:00:00,, 1, 0, 2 февраля 2003 г. 12:00 PM

+0

Не могли бы вы предоставить образец ввода и вывода? –

+1

Итерации по совпадениям, найденным с 'm // g'. – syck

ответ

4

Вы заменяете все даты, которые являются i dentical к первому дате времени линии. Вы даже не пытаетесь найти какие-либо другие даты.

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

В соответствии с моими выводами моего текстового файла он заменяет дату и время каждой строки отдельно, за исключением того, что игнорирует все, что есть после первого времени в этой строке. Идти, чтобы дать вашему коду выстрел прямо сейчас! Благодарю. EDIT: Работает как шарм, спасибо вам, сэр! – Gary

+0

Не совсем. Как я уже сказал, «вы заменяете ** все ** те времена, которые ** идентичны ** для первого времени и времени строки». Если у вас есть «15 мая 2007 года 12:00 ... 15 мая 2007 года 12:00», оба будут заменены. Другие даты не заменяются, потому что вы даже не ищете их. – ikegami

+0

Ahhh благодарит вас за разъяснение! Очень признателен. И большое спасибо, я не знал, что вы можете использовать модуль time :: piece в синтаксисе подстановки. – Gary