2

我可以使用Perltidy重新格式化源代码。很有用。

如果源文件使用类似的变量@m,我怎样才能最容易地将其重构为其他东西,例如@miles_travelled

使用正则表达式重命名似乎并不安全,因为$m可能还存在一个单独的变量,@m$m[$i]

例如,对于 Perl 代码,以下内容均不正确:

  • s/([\$\@])m/$1miles_travelled/g# 将重命名同名的标量
  • s/\$m/\$miles_travelled/g# 将无法重命名数组的访问

是否有推荐的工具或方法在 Perl 代码中安全地重命名变量名?

4

2 回答 2

5
  1. 变量$m总是以$m.
  2. 变量@m总是以@m或出现$m[...]
  3. 变量%m总是以%mor$m{...}或的形式出现@m{...}

... 除了间接方法调用:new $m[...]解析为$m->new([...]). 但是我们可能会忽略这种情况(用于no indirect确保)。

如果我们想正确覆盖前三种情况,我们可以

  1. 将标量替换为s/(?<=\$)OLDNAME(?!\s*[\[\{])/NEWNAME/g
  2. 将数组替换为s/(?<=\@)OLDNAME(?!\{)|(?<=\$)OLDNAME(?=\s*\[)/NEWNAME/g
  3. 将哈希替换为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-09T10:37:36.297 回答
0

The Padre editor will carry out a small number of simple refactorings automatically for you. "Rename variable" is one of them.

于 2013-10-09T13:27:21.487 回答