我正在尝试评估一组环境变量,然后再继续执行代码 这是作品:
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
。
答案 0 :(得分: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}
将变为未定义
答案 1 :(得分: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;