2016-11-27 111 views
-1

我試圖用代碼的任何進一步 這裏出發前,評估組環境變量是件:如何讓eval返回零而不是什麼?

for my $var qw(ENV_VAR1 ENV_VAR2 ENV_VAR3) { 
    my $value = eval '$ENV{"$var"}'; 
    print "$var = $value\n"; 
    die "$var not defined, exiting .." unless $value; 
} 

它會因打印行錯誤:

使用未初始化在 ./mycode.pl線205

在級聯(。)或字符串值,這是否意味着eval其實不是返回興?如何讓它歸零或者可以用更好的方式完成整件事?

奇怪的是,如果我定義並取消定義底層ksh中的變量(例如export ENV_VAR1=anything;export ENV_VAR1=;),那麼它會正確地停止並顯示正確的消息,但它會給我另一個uninitialized value作爲下一個變量。

+4

取代'我$值= EVAL「$ ENV {‘$ VAR’}」',你爲什麼不只是寫我的' $ value = $ ENV {$ var}'? – Borodin

+0

它不展開$ var –

+0

嗯..你是對的,它好像在某些時候代碼拒絕展開$ var ..所以我用eval –

回答

2

你的代碼不會編譯。它需要附加的括號qw(...)

這裏不需要eval。你可以用$ENV{$var}來獲取環境變量,如果沒有這樣的變量,將會是undef

測試一個未定義的值並且相應地行爲很簡單,也許這樣?

for my $var (qw/ ENV_VAR1 ENV_VAR2 ENV_VAR3 /) { 

    my $value = $ENV{$var}; 

    die "\$value not defined, exiting .." unless defined $value; 

    print "\$var = $value\n"; 
} 

如果使用export ENV_VAR1=那麼你的變量設置爲空字符串$ENV{ENV_VAR1}將被定義,但有一個長度爲零。要刪除環境變量,你需要unset ENV_VAR1,當$ENV{ENV_VAR1}將成爲不確定

0

事實上,有一個簡單的方法:

if (defined $ENV{"VAR"}) { 
    # true for "export VAR=;" and "export VAR=VAL;" 
} else { 
    # VAR is not set (not even to an empty value) 
} 

像Perl 5.10的存在defined-or操作//,這是你的情況很方便:

$value = $ENV{"VAR"} // "VAR is not defined"; 
$value = $ENV{"VAR"} || "VAR is not defined or set to an empty string or 0"; 

你的情況:

my $value = $ENV{$var} // 0; 
+0

*「對於」導出VAR =;「和」導出VAR = VAL「是真實的」「*您確定嗎?所以沒有辦法告訴一個環境變量是否爲空或者包含'1'(或者你認爲它返回的任何*真*值) – Borodin

+0

@Borodin是的,我確定。你有沒有注意到我的'if'中的'defined'?如果是這樣,那麼請給我一個代碼錯誤的例子。 – PerlDuck

+0

啊好的。無論「定義」是什麼,我都認爲您的評論涉及'$ ENV {...}'的值。 'export VAR ='將變量設置爲空字符串並將其導出。要獲得一個'undef'值,你必須'取消設置VAR',所以嚴格的你沒有設置*應該是*沒有設置*。 – Borodin