正規表現のオプションメモ

$path = '/home/user/(__value1*value2__)/(__value2/1000__)/(__value3__)/test.txt';
replace_with_variables( $path, { value1 => 1, value2 => 2,  value3 => 1 } );

sub replace_with_variables {
    my ($path, $args) = @_;
    my $value1 = $args->{value1};
    my $value2 = $args->{value2};
    my $value3 = $args->{value3};

    my @vals = $path =~ /\(__(.+?)__\)/g;

    my $count = 0;
    my @regex_map = map{ $count++; ["__________${count}" => $_ ] } @vals;

    for(@regex_map){
        my $val_key = $_->[0];
        $path =~ s/\(__(.+?)__\)/$val_key/o;
    }

    for(@regex_map){
        $_->[1] =~ s/value1/$value1/g if $value1;
        $_->[1] =~ s/value2/$value2/g if $value2;
        $_->[1] =~ s/value3/$value3/g if $value3;

        my $error;
        {
            local $@;
            $_->[1] = eval( $_->[1] );
            $error = $@;
        }
        if($error){
            die 'eval missed';
        }

        my $key = $_->[0];
        my $val = $_->[1];
        $path =~ s/$key/$val/;
    }
    return $path;
}

というようなファイルパスを置換するモジュールを作成してたのですが、
最後の置換のところでちょっとしくったので、そこんとこメモ。

  $path =~ s/$key/$val/o;

と、正規表現オプションのoを付けると、

/home/user/2/__________2/__________3/test.txt

っとな、置換が1度しか実行されない状態になります。
オプションoをきちんと確認。

「 /o => パターンを1回だけコンパイルする 」

ううん、、しっくりこないので、また明日調べるよ。