我可以使用Perltidy重新格式化来源。非常有用。
如果源文件使用类似@m
的变量,我怎样才能最轻松地将其重构为其他内容,例如@miles_travelled
?
使用正则表达式进行重命名似乎不安全,因为单独的变量(如$m
)也可能存在(使用不同的类型,在本例中为标量),但@m
变量可以使用类似$m[$i]
的表达式引用。
例如,对于Perl代码,以下任何内容都不正确:
s/([\$\@])m/$1miles_travelled/g
#将重命名同名的标量s/\$m/\$miles_travelled/g
#将无法重命名数组是否有推荐的工具或方法在Perl代码中安全地重命名变量名?
答案 0 :(得分:5)
$m
始终显示为$m
。@m
始终显示为@m
或$m[...]
。%m
始终显示为%m
或$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;
答案 1 :(得分:0)
Padre editor会自动为您执行少量简单的重构。 “重命名变量”就是其中之一。