Perlcritic:我该如何解析'^ Magic变量“ $ ENV”应该分配为“ local”'?

ali*_*sea 2 perl environment-variables perl-critic

我正在编写一个Perl脚本,该脚本需要在调用外部程序之前设置许多环境变量。我的代码具有以下形式

$ENV{'VAR1'}    = "value1";
$ENV{'VAR2'}    = "value2";
Run Code Online (Sandbox Code Playgroud)

通过perlcritic运行此程序时,每次此类分配都会收到严重性为4的违规:

^Magic variable "$ENV" should be assigned as "local"
Run Code Online (Sandbox Code Playgroud)

谷歌搜索该错误消息并没有给我任何好的解决方案。在这种情况下,抱怨的过激冲突是Variables :: RequireLocalizedPunctuationVars,给出的示例涉及本地化文件句柄。我试图在Perl最佳实践中找到相关的部分,但它仅涉及本地化软件包变量。

我尝试的一种解决方案是在分配之前使用以下语句本地化%ENV。

local %ENV = ();
Run Code Online (Sandbox Code Playgroud)

这不能解决违规问题。

我的问题如下:

这种Perlcritic违规行为甚至与%ENV的分配相关,还是我可以忽略它?

如果相关,解决它的最佳方法是什么?

cho*_*oba 5

您只能本地化给定环境变量的值:

local $ENV{VAR1} = 'value1';
Run Code Online (Sandbox Code Playgroud)


tjd*_*tjd 5

过高的警告不是上帝的道。它们只是警告有关如果管理不当可能会给您带来麻烦的情况。

这种Perlcritic违规行为甚至与%ENV的分配相关,还是我可以忽略它?

此警告告诉您:

  1. 全局变量具有远距离作用的真正可能性。
  2. 当处理那些更改内置函数操作的变量时,这种可能性甚至更加危险。

这与之相关%ENV吗?如果您在程序中产生了多个子进程,请选择“是”。如果以后有人更改您的程序以产生另一个孩子,请选择“是”。

如果相关,解决它的最佳方法是什么?

现在,在这里,人类变得很重要。您需要做出价值判断。

可能的动作:

  • 忽略警告,并希望将来的维护者不会被您使用此全局变量所困扰。
  • 更改您的代码,以避免出现警告的情况。choroba建议的语法是一个不错的选择。

现在,如果您进行了更改,仍然收到警告,并且认为警告现在有误,则可以执行以下一项或多项操作:

  • 成为好公民并提交错误报告。
  • ## no critic (RequireLocalizedPunctuationVars)在受影响的行上使用注释,或在相关行之前使用它自己的行。
  • 或更严重地禁用规则或仅%ENV.perlcriticrc文件中为其创建例外。