如何让eval返回零而不是什么?

时间:2016-11-27 16:54:22

标签: perl

我正在尝试评估一组环境变量,然后再继续执行代码 这是作品:

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

2 个答案:

答案 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;