Почему я получаю предупреждения "неинициализированное значение", когда я использую метод 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 неинициализированы. Трудно сказать без контекста.

Другие вопросы по тегам