2012-12-17 55 views
2

我在Perl如何檢查環境變量是否已設置?

my %Opt = 
    (
    boards_txt => "$ENV{'ARDUINO_DIR'}/hardware/arduino/boards.txt", 
); 

下面的代碼在此你可以看到環境變量ARDUINO_DIR是追加。一些用戶可能沒有這個變量集。如果是這種情況,那麼我想硬編碼一個路徑。

問題:如何檢查env變量是否設置?

回答

3

您已經使用%ENV哈希值。它包含了所有的環境變量,所以你可以這樣做:

if (defined $ENV{'ARDUINO_DIR'}) { $prefix = $ENV{'ARDUINO_DIR'} } 
else { $prefix = '/path/to/arduino/dir/' } 

my $path_to_txt = $prefix . 'boards.txt'; 

我建議你使用File::Spec與路徑工作。

2

您可以檢查哈希鍵值的存在與exists

perl -le 'print "fnord!" if exists $ENV{"ARDUINO_DIR"}' 
+1

...雖然我更傾向於在這種情況下使用「長度」 – ikegami

+0

是的。 「存在」是必需的,但不是一個充分的標準。該鍵可能存在,但其值仍未定義,在這種情況下,env var將不會被設置。 – mpe

6

正確的答案已經給出,但我想補充一點,你可能會使用相當方便defined-or賦值運算符//=的:

my $dir = $ENV{'ARDUINO_DIR'}; 
$dir //= "/other/path";   

或者,如RobEarl指出的評論:

my $dir = $ENV{'ARDUINO_DIR'} // "/other/path"; 

這是的邏輯等效

my $dir; 
if (defined $ENV{'ARDUINO_DIR'}) { 
    $dir = $ENV{'ARDUINO_DIR'}; 
} else { 
    $dir = "/other/path"; 
} 

由於mob指出,定義或操作符需要perl v5.10。對於那些誰還沒升級到這個版本,也可以使用||操作:

my $dir = $ENV{'ARDUINO_DIR'} || "/other/path"; 

需要說明的是,這將會覆蓋被解釋爲假值,這在某些情況下可以考慮適當的值,如空字符串或零。但是,在這種情況下,0或空字符串不可能是有效的路徑。

+1

或只是'my $ dir = $ ENV {'ARDUINO_DIR'} //「/ other/path」;' – RobEarl

+0

@RobEarl好主意,補充。 – TLP

+0

適合任何使用Perl v5.10或更高版本的人。 – mob