我可以使用帕尔蒂重新格式化源代码。非常有用。
如果源文件使用像@m这样的变量,我如何才能最容易地将其重构为其他东西,例如@miles_travelled
使用正则表达式重命名似乎不安全,因为像$m这样的单独变量也可能存在(在本例中是标量),但是可以使用像$m[$i]这样的表达式引用@m变量。
例如,对于Perl代码,下列任何一项都不正确:
s/([\$\@])m/$1miles_travelled/g #将用相同的名称重命名标量s/\$m/\$miles_travelled/g #将无法重命名数组的访问是否有在Perl代码中安全地重命名变量名的推荐工具或方法?
发布于 2013-10-09 10:37:36
$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;发布于 2013-10-09 13:27:21
Padre编辑将为您自动执行少量的简单重构。“重命名变量”就是其中之一。
https://stackoverflow.com/questions/19268034
复制相似问题