在Perl代码中重构变量名的推荐方法?

时间:2013-10-09 09:27:25

标签: perl refactoring

我可以使用Perltidy重新格式化来源。非常有用。

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

使用正则表达式进行重命名似乎不安全,因为单独的变量(如$m)也可能存在(使用不同的类型,在本例中为标量),但@m变量可以使用类似$m[$i]的表达式引用。

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

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

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

2 个答案:

答案 0 :(得分:5)

  1. 变量$m始终显示为$m
  2. 变量@m始终显示为@m$m[...]
  3. 变量%m始终显示为%m$m{...}@m{...}
  4. ...除了间接方法调用外:new $m[...]解析为$m->new([...])。但我们可能会忽略这种情况(使用no indirect来确保)。

    如果我们想要正确覆盖前三个案例,我们可以

    1. s/(?<=\$)OLDNAME(?!\s*[\[\{])/NEWNAME/g
    2. 替换标量
    3. s/(?<=\@)OLDNAME(?!\{)|(?<=\$)OLDNAME(?=\s*\[)/NEWNAME/g
    4. 替换数组
    5. s/(?<=\%)OLDNAME|(?<=[\$\@])OLDNAME(?=\s*\{)/NEWNAME/g
    6. 替换哈希值

      请注意,不同情况的外观或多次传递是必要的。

      测试:

      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会自动为您执行少量简单的重构。 “重命名变量”就是其中之一。