2015-03-31 62 views
1

我正在写一个perl脚本,需要在调用外部程序之前设置一些环境变量。我的代码的形式Perlcritic:我该如何解决'^魔术变量“ENV”应该被分配为“本地”?

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

当通过perlcritic运行此,我得到一个严重违反4为每个这样的assignement:

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

谷歌搜索该错误消息并没有给我什么好的解决办法。在这种情况下抱怨的违规违规行为是Variables :: RequireLocalizedPunctuationVars,并且给出的示例涉及本地化文件句柄。我试图找到Perl最佳实践中的相关部分,但它只谈及本地化软件包变量。

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

local %ENV =(); 

这并不能解决违规问题。

我的问题是:

那是Perlcritic违反即使分配到%ENV有关,或者我可以忽略它?

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

回答

3

Perlcritic警告是不是神的话语。他们仅仅是警告,如果管理不当,可能会让你陷入困境。

这是违法违规甚至与%ENV的任务相关,或者 我可以忽略它吗?

此警告告诉你:

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

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

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

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

可能采取的行动:

  • 忽略警告,并希望将来的维护人员不被你这个全局变量的使用咬伤。
  • 更改您的代码以避免您被警告的情况。 choroba建议的语法是一个很好的选择。

现在,如果你已经做出了改变,仍然得到警告,并相信该警告,现在是错误的,你可以做一个或多个:

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

choroba的建议确实使警告无声,所以我现在很好走。 – alisea 2015-04-02 07:12:39

4

您可以只为给定的环境变量本地化值:

local $ENV{VAR1} = 'value1'; 
2

考虑使用Envperlcritic不会抱怨变数:

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

$VAR = "value1"; 
+1

Perl模块名称区分大小写,所涉及的模块是“Env”,而不是“ENV”。否则,该解决方案将无法在Linux下运行。 – alisea 2015-07-16 11:22:58

+0

@alisea:谢谢。我更新了答案以修正错字。 – toolic 2015-07-16 13:10:59