如何在Perl中替换字符串中的一个或多个字符串

时间:2012-04-23 10:39:26

标签: regex perl

$ args [0]是对包含一次或多次的字符串的引用。我每次都按可变的秒数移动,但是我需要找到一种方法来将更改的时间存储(替换)回原始字符串。任何帮助表示赞赏。以下是我正在使用的内容:

    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]} !

    }

1 个答案:

答案 0 :(得分: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