Использование неинициализированного значения $Row[3] в конкатенации (.) или строке

#perl #otrs

Вопрос:

В настоящее время я получаю эту ошибку в своей системе OTRS, и я не могу понять, что происходит.

Ошибка в системном журнале:

Произошла ошибка при выполнении Execute() в ядре::Система::Консоль::Команда::Maint::Опрос::RequestsDelete: Использование неинициализированного значения $Строка[3] в конкатенации (.) или строка в /opt/otrs/Ядро/Система/Консоль/Команда/Maint/Опрос/RequestsDelete.pm строка 132.

Часть кода, которая неисправна:

 # fetch the result        
while ( my @Row = $DBObject->FetchrowArray() ) {

                my $Result = join(
                    ' ', "Survey:" . $Row[0] . "t",
                    "TicketNumber:" . $Row[1] . "t",
                    "SendTime:" . $Row[2] . "t",
                    "VoteTime:" . $Row[3] . "t",
                    "CreateTime:" . $Row[4] . "t"
                );

                $Self->Print("$Resultn");
            }
 

Комментарии:

1. Это означает, что переменной $Row[3] не было присвоено значение или ей было присвоено значение undef . Возможно warnings , они включены, вот почему появляется это сообщение (что хорошо).

2. тихая странность, потому что я не могу видеть этот ряд на интерфейсе. Кроме того, я запускаю RequestsDelete по ssh, и никаких ошибок не происходит, а журналы по-прежнему пусты. Распечатать здесь: imgur.com/73tEW8E

3. Независимо от этого предупреждения, $Result значение должно выводиться в консоли.

4. Как я могу это сделать?

Ответ №1:

Можете ли вы проверить схему БД для таблицы, доступ к которой осуществляется через $DBObject->FetchrowArray() ? Первое, что нужно сделать, это убедиться, что эти поля действительно существуют.

Независимо от того, можете ли вы проверить схему или нет, рекомендуется выполнить проверку полей и указать значение по умолчанию, если это не так, например

 $Row[3] = '' if not defined $Row[3];
 

или

 $Row[3] = '-' if not defined $Row[3];
 

или

 $Row[3] = 'not defined' if not defined $Row[3];
 

или

 $Row[3] //= 'not defined';
 

Тогда ваш код будет защищен от пропущенных данных.

Просто используйте значение по умолчанию, которое имеет смысл для вывода.

Комментарии:

1. @ikegami, это отличная идея! Я склонен избегать кратких примеров, так как они иногда сбивают с толку людей, незнакомых с Perl, но лично мне нравится этот синтаксис.