gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:48:49 26 4
gpt4 key购买 nike

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

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

使用正则表达式重命名似乎并不安全,因为可能还存在诸如 $m 之类的单独变量(具有不同的类型,在本例中为标量),但是 @m 变量可以使用像 $m[$i] 这样的表达式来引用。

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

  • s/([\$\@])m/$1miles_travelled/g # 将重命名具有相同名称的标量
  • s/\$m/\$miles_travelled/g # 重命名数组访问将失败

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

最佳答案

  1. 变量$m总是以 $m 的形式出现.
  2. 变量@m总是以 @m 的形式出现或 $m[...] .
  3. 变量%m总是以 %m 的形式出现或 $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;

关于perl - 在 Perl 代码中重构变量名的推荐方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19268034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com