gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:47:34 25 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/

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