Perlcritic:如何解决“^魔术变量“$ENV”应分配为 "local"”?

Perlcritic: How can I resolve '^Magic variable "$ENV" should be assigned as "local"'?

我正在编写一个 perl 脚本,需要在调用外部程序之前设置一些环境变量。我的代码格式为

$ENV{'VAR1'}    = "value1";
$ENV{'VAR2'}    = "value2";

当 运行 通过 perlcritic 时,我对每个这样的分配都得到了严重性 4 违规:

^Magic variable "$ENV" should be assigned as "local"

谷歌搜索该错误消息并没有给我任何好的解决方案。在这种情况下抱怨的 perlcritic 违规是 Variables::RequireLocalizedPunctuationVars,并且给出的示例涉及本地化文件句柄。我试图在 Perl Best Practices 中找到相关部分,但它只讨论本地化包变量。

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

local %ENV = ();

这不能解决违规问题。

我的问题如下:

Perlcritic 违规是否与 %ENV 的分配相关,或者我可以忽略它吗?

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

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

local $ENV{VAR1} = 'value1';

Perlcritic 警告不是上帝的话。它们只是对某些情况的警告,如果管理不当,可能会给您带来麻烦。

Is that Perlcritic violation even relevant for assignments to %ENV, or can I ignore it?

此警告告诉您:

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

这与 %ENV 相关吗?如果您在您的程序中生成多个 child 进程,是的。如果以后有人更改您的程序以产生另一个 child,是的。

If it's relevant, what's the best way to resolve it?

这就是做人变得重要的地方。你需要做出价值判断。

可能的操作:

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

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

  • 做个好公民 Submit a bug report.
  • 在受影响的行上或在相关行之前的自己的行上使用注释 ## no critic (RequireLocalizedPunctuationVars)
  • 或更过分地禁用规则或只是在 .perlcriticrc 文件中为 %ENV 创建一个例外。

考虑使用 Envperlcritic不抱怨变量:

use warnings;
use strict;
use Env qw(VAR);

$VAR = "value1";