2

我正在编写一个 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 的分配有关,还是我可以忽略它?

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

4

3 回答 3

6

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

local $ENV{VAR1} = 'value1';
于 2015-03-31T09:09:06.900 回答
6

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

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

此警告告诉您:

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

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

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

现在,这里是作为人变得重要的地方。你需要做出价值判断。

可能的行动:

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

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

  • 做一个好公民并提交错误报告。
  • ## no critic (RequireLocalizedPunctuationVars)在相关行之前使用受影响行或它自己的行上的注释。
  • %ENV或者更过度地禁用规则,或者只是在您的.perlcriticrc文件中创建一个例外。
于 2015-03-31T16:05:55.063 回答
2

考虑使用Envperlcritic不抱怨变量:

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

$VAR = "value1";
于 2015-03-31T18:26:49.130 回答