Я пытаюсь оценить набор переменных среды, прежде чем продолжить работу с кодом. Вот фрагмент:

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;
}

Выдает ошибку для строки печати:

Использование неинициализированного значения в конкатенации (.) Или строки в строке 205 ./mycode.pl.

Означает ли это, что eval на самом деле ничего не возвращает? Как сделать так, чтобы он возвращал ноль или, может быть, весь кусок можно сделать лучше?

Как ни странно, если я определяю, а затем отменяю определение переменной в базовом ksh (например, export ENV_VAR1=anything;export ENV_VAR1=;), она должным образом умирает с правильным сообщением, но затем дает мне еще один uninitialized value для следующей переменной.

-1
george kushner 27 Ноя 2016 в 19:54

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} станет undefined

2
Borodin 28 Ноя 2016 в 19:22

Действительно, есть способ попроще:

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 {{X0 }}, что очень удобно в вашем случае:

$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
PerlDuck 27 Ноя 2016 в 18:01