Определение perl-функции завершается неудачно с неинициализированным значением - PullRequest
0 голосов
/ 10 сентября 2018

Мои perl-настройки немного устарели, поэтому я, вероятно, здесь упускаю что-то действительно очевидное, но я добавил небольшой модуль в некоторый код CGI более старого кода для рефакторинга общих функций.Вот выдержка из модуля с той частью, которая доставляет мне проблемы:

package Common;

use strict;
use warnings;
use base 'Exporter';
our @EXPORT_OK = (&fail_with_error);

sub fail_with_error {
    my ($errmsg, $textcolor) = @_;
    my $output = printf("<p><font color=\"%s\">ERROR: %s </font>/<p>", $textcolor, $errmsg);
    print($output);
    exit(1);
}

Когда я выполняю этот модуль напрямую с perl Common.pm (или когда я просто импортирую функцию в тестовом коде, даже не вызываяэто) то, что я получаю, это ошибка неинициализированного значения для $errmsg и $textcolor, например:

$ perl Common.pm
Use of uninitialized value $textcolor in printf at Common2.pm line 10.
Use of uninitialized value $errmsg in printf at Common2.pm line 10.
<p><font color="">ERROR:  </font>/<p>1

Казалось бы, perl выдает предупреждение, потому что он выполняет код подпрограммы буквально, ноСущность подпрограммы в том, что она абстрагирована, поэтому разные значения могут быть переданы корректно?Разумеется, их не нужно заполнять, чтобы передавать предупреждения интерпретатора, но, тем не менее, что-то не так.

Я искал вокруг, но эта ошибка очень распространена, потому что в большинстве случаев переменная действительно неинициализирована.Кажется, я не могу найти ничего подходящего для этого типа дела.

1 Ответ

0 голосов
/ 10 сентября 2018

Это потому, что вы случайно заполняете @EXPORT_OK вызовом fail_with_error: &fail_with_error вместо имени функции.Это вызывает fail_with_errors с аргументами, заполненными из текущего @_, который оказывается пустым - поэтому, естественно, обе переменные неинициализированы (а также ваша функция не экспортируется).Правильное назначение использует только имя подпрограммы:

our @EXPORT_OK = qw( fail_with_error );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...