正規表現のオプションメモ
$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回だけコンパイルする 」
ううん、、しっくりこないので、また明日調べるよ。