- 变量
$m
总是以$m
.
- 变量
@m
总是以@m
或出现$m[...]
。
- 变量
%m
总是以%m
or$m{...}
或的形式出现@m{...}
。
... 除了间接方法调用:new $m[...]
解析为$m->new([...])
. 但是我们可能会忽略这种情况(用于no indirect
确保)。
如果我们想正确覆盖前三种情况,我们可以
- 将标量替换为
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;