2015-03-31 38 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

相關問題