Почему я получаю предупреждения "неинициализированное значение", когда я использую метод sortByLength типа Date:: Manip?
Как может этот блок кода в Date/Manip.pm из модуля Date::Manip:
#*Get rid of a problem with old versions of perl
no strict "vars";
# This sorts from longest to shortest element
sub sortByLength {
return (length $b <=> length $a);
}
use strict "vars";
Я получаю это предупреждение:
Use of uninitialized value in length at /perl/lib/perl5.8/Date/Manip.pm line 244.
3 ответа
Проблема на самом деле не находится там; функция просто вызывается с недопустимыми (undef) параметрами. Чтобы получить лучшее представление о том, откуда оно пришло, попробуйте это:
$SIG{__WARN__} = sub {
require Carp;
Carp::confess("Warning: $_[0]");
};
Это напечатает трассировку стека для всех предупреждений.
Или $a
или же $b
являются неопределенными Проверьте список, который вы передаете в сортировку, которая использует эту подпрограмму, чтобы увидеть, есть ли у вас неопределенное значение.
Как вы используете этот код?
Если были включены предупреждения о неинициализированной диагностике (возможно, через одеяло -w
или же use warnings;
) и если sortByLength как-то вызывается как обычная подпрограмма, а не как sort {}
функция, вы, вероятно, увидите эту ошибку:
$ perl -Mwarnings=uninitialized -e 'sub sbl { (length $b <=> length $a) } sbl'
Use of uninitialized value in length at -e line 1.
Use of uninitialized value in length at -e line 1.
Здесь я получаю два предупреждения, потому что оба $a
а также $b
неинициализированы. Трудно сказать без контекста.