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は常に%mまたは$m{...}またはとして発生し@m{...}ます。

… 間接的なメソッド呼び出しを除いて:new $m[...]として解析し$m->new([...])ます。しかし、おそらくこのケースは無視できます (no indirect確認のために使用してください)。

最初の 3 つのケースを適切にカバーしたい場合は、次のことができます。

  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

Padre エディターは、少数の単純なリファクタリングを自動的に実行します。「変数の名前を変更」もその1つです。

于 2013-10-09T13:27:21.487 に答える