2012-04-23 175 views
0

$ args [0]是對包含一次或多次的字符串的引用。我每次移動的時間是可變的秒數,但是我需要找到一種方法將更改的時間存儲(替換)回原始字符串。任何幫助表示讚賞。這裏大概是我的工作:如何在Perl中替換字符串中的一個或多個字符串

my $TIMEREGEX = qr/(\d{2}:\d{2}:\d{2}\.\d{3}|\d{2}:\d{2}:\d{2})/x; 
    if (my @sTime = ${$args[0]} =~ /$TIMEREGEX/g) 
    { 
     warn "\ttime(s) found @sTime\n" if $main::opt{d}; 
     for my $i (0..$#sTime) 
     { 
      $sTime[$i] =~ /(\d{2}):(\d{2}):(\d{2})(\.(\d{3}))?/; 
      my $epoch_time = ($1 * 3600) + ($2 * 60) + $3; 
      $epoch_time += $epoch_shift; 
      my @f; 
      $f[0] = $epoch_time % 86400/3600; # hours 
      $f[1] = $epoch_time % 3600/60; # minutes 
      $f[2] = $epoch_time % 60;   # seconds 
      my $save = $sTime[$i]; 
      $sTime[$i] = sprintf ("%02d:%02d:%02d", $f[0], $f[1], $f[2]); 
      $sTime[$i] .= $4 if defined ($4); 
      warn "\tTimeShift $save => $sTime[$i]\n" if $main::opt{d}; 
      ### some other stuff 
     } 

     # ${$args[0]} = "$1$t[0]$4$t[1]$7$t[2]$10"; 
     ### save the changes to ${$args[0]} ! 

    } 
+0

也許你在尋找's ///'?還可以用'e'鍵使用'/// e'。 – gaussblurinc 2012-04-23 10:57:01

+1

或期待'split'函數和'join'函數。他們會讓你的工作變得更簡單;) – gaussblurinc 2012-04-23 10:58:24

+3

爲什麼不使用可以爲你處理時間的模塊?像[DateTime](http://search.cpan.org/perldoc?DateTime)或[Time :: Piece](http://search.cpan.org/perldoc?Time::Piece)。 – TLP 2012-04-23 10:59:04

回答

2

使用substitution operator

use 5.010; # or better for 'say' and '//' 
use strictures; 
use Time::Piece qw(); 

my @args; my $epoch_shift = 500; 
${$args[0]} = 'foo18:00:00.123bar18:00:00baz18:00:00quux'; 

${$args[0]} =~ 
    s{ 
     (\d{2}:\d{2}:\d{2}) # capture hh:mm:ss 
     (\.\d{3})?   # optionally capture 
          # decimal dot and milliseconds 
    } 
    { 
     (
      $epoch_shift 
      + Time::Piece->strptime($1, '%T') 
     )->strftime('%T').($2 // '') 
    }egx; 
say ${$args[0]}; 
# foo18:08:20.123bar18:08:20baz18:08:20quux 
+0

謝謝!我沒有想到在替換中使用表達式 – harmonic 2012-04-28 14:14:51

相關問題