- 変数
$m
は常に として発生し$m
ます。
- 変数
@m
は常に@m
またはとして発生し$m[...]
ます。
- 変数
%m
は常に%m
または$m{...}
またはとして発生し@m{...}
ます。
… 間接的なメソッド呼び出しを除いて:new $m[...]
として解析し$m->new([...])
ます。しかし、おそらくこのケースは無視できます (no indirect
確認のために使用してください)。
最初の 3 つのケースを適切にカバーしたい場合は、次のことができます。
- スカラーを次のように置き換えます
s/(?<=\$)OLDNAME(?!\s*[\[\{])/NEWNAME/g
- 配列を置き換える
s/(?<=\@)OLDNAME(?!\{)|(?<=\$)OLDNAME(?=\s*\[)/NEWNAME/g
- ハッシュを
s/(?<=\%)OLDNAME|(?<=[\$\@])OLDNAME(?=\s*\{)/NEWNAME/g
さまざまなケースのルックアラウンドまたは複数のパスが必要であることに注意してください。
テスト:
use Test::More tests => 3;
my $scalar_re = qr/(?<=\$) foo (?!\s*[\[\{])/x;
my $array_re = qr/(?<=\@) foo (?!\{) | (?<=\$) foo (?=\s*\[)/x;
my $hash_re = qr/(?<=\%) foo | (?<=[\$\@]) foo (?=\s*\{)/x;
my $input = '$foo, $foo[1], @foo, $foo{a}, %foo, @foo{qw/a b/}';
my $scalar = '$bar, $foo[1], @foo, $foo{a}, %foo, @foo{qw/a b/}';
my $array = '$foo, $bar[1], @bar, $foo{a}, %foo, @foo{qw/a b/}';
my $hash = '$foo, $foo[1], @foo, $bar{a}, %bar, @bar{qw/a b/}';
is $input =~ s/$scalar_re/bar/xrg, $scalar;
is $input =~ s/$array_re /bar/xrg, $array;
is $input =~ s/$hash_re /bar/xrg, $hash;