Почему моя Perl-программа предупреждает о неинициализированном значении? - PullRequest
2 голосов
/ 12 февраля 2010

Я написал скрипт на Perl, ниже которого выдается предупреждение, и я не могу понять, почему.

#!/usr/local/bin/perl -w

$status = $ENV{ 'STATUS' };
if ( $status eq "" )
{
    $status = 0;
}
else
{
    $status = 1;
}

Там написано "Use of uninitialized value in string eq at ./x.pl line 4."

Строка 4 - это строка "if ( $status eq "" )", но переменная была инициализирована ..

Любые идеи, как мне избавиться от этого предупреждения ..

Ответы [ 3 ]

7 голосов
/ 12 февраля 2010

Другой вариант -

$status = $ENV{ 'STATUS' } // '';

, которая установит $status в пустую строку, если она не определена, но оператор // существует только в perl 5.10 и более поздних версиях. Эквивалентный синтаксис до 5.10:

$status = defined $ENV{STATUS} ? $ENV{STATUS} : '';

хотя многие люди подделывают это с

$status = $ENV{ 'STATUS' } || '';

но это изменит $ENV{STATUS} из 0 в пустую строку, что может быть или не быть проблемой для вас.

Однако это все ответы общего характера. В указанном вами коде, заменив все это на

$status = defined $ENV{STATUS} ? 1 : 0;

или даже просто

$status = defined $ENV{STATUS};

(если у вас все в порядке со значением 'not set', представляющим собой пустую строку вместо 0), будет лучшим вариантом.

6 голосов
/ 12 февраля 2010

$ENV{'STATUS'} не может быть определено.

Если вы запустите

export STATUS=blah

в оболочке перед запуском сценария perl, она будет работать

исправить с помощью

#!/usr/local/bin/perl -w
$status = $ENV{ 'STATUS' };
if (!defined($status) || $status eq "" )
{
    $status = 0;
}
else
{
    $status = 1;
}
3 голосов
/ 12 февраля 2010

Я знаю, что ваш вопрос касается предупреждения, но вы можете использовать условный оператор ?: , чтобы установить $ status, если не определено, или пустая строка

$status = $ENV{'STATUS'} ? 1 : 0;
...