2016-07-26 93 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