2012-12-17 50 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