2016-07-26 4 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:例を追加しました

入力:

2007年5月15日12時00分AM、1、0、2003年2月2日12:00 PM

出力:

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

+0

サンプルの入力と出力を提供できますか? –

+1

'm // g'で見つかったマッチに対して反復処理を行います。 – syck

答えて

4

私はすべてのdatetimesを置き換えていますその行の最初の日時に派生しています。あなたは他の日時も見つけようとしません。

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

結局のところ、あなたはあなたの質問のために選択した対象は:)


注非常に適切であった:私は%Iよりも適切に%H(0..23として時間)に変更(時は1..12)。

+0

私のテキストファイルの出力によれば、各行のdatetimeは、その行内の最初のdatetimeの後にあるものを無視する点を除いて、個々に置き換えられます。あなたのコードに今すぐショットを与えるつもり!ありがとう。 編集:魅力のように動作します。ありがとうございます! – Gary

+0

私が言ったように、あなたは**すべて** ** line **の最初のdatetimeに**同一の** datetimesを置き換えています。 「2007年5月15日12:00 AM ... 5月15日12:00 AM」の場合、どちらも交換されます。他の日付時刻は、あなたが探していないので置き換えられません。 – ikegami

+0

ああ、明確化のためにありがとう!とても有難い。そして、ありがとう、私はあなたが代入構文内でtime :: pieceモジュールを使用できるかどうか分からなかった。 – Gary

関連する問題