Почему эта строка кода Perl выдает числовое предупреждение GT? - PullRequest
2 голосов
/ 24 февраля 2011

У меня есть следующее условие:

if ($self->path ne 'contact_us' && !grep { $status == $_ } 2, 3, 8) {

И выдает это предупреждение:

Использование неинициализированного значения в числовом gt (>)

Конечно, на поверхности вообще нет числовых gt.$ self-> path является средством доступа к атрибутам Moose, так что единственная магия под капотом будет исходить из этого.Но я не могу понять, как это могло бы сделать числовое сравнение gt, тем более что path определяется следующим образом:

has 'path' => (is => 'rw', isa => 'Str');

Есть идеи о том, как выдается это предупреждение?Я использую Perl v5.8.8, созданный для i386-linux-thread-multi, если это имеет значение в этом случае.

Обновление : еще более таинственным образом я переписал условное выражение какследует:

my $cond1 = $self->path ne 'contact_us';
my $cond2 = !grep { $status == $_ } 2, 3, 8;
if ($cond1 && $cond2) {

И это третья строка, которая выдает предупреждение.Трассировка стека Carp::Always недостаточно информативна.Некоторое дальнейшее раскрытие, поскольку сейчас я чувствую себя совершенно неосведомленным: базовый файл - это скрипт FastCGI, вызываемый модулем Apache mod_fcgi.

Последнее обновление: $status было установлено с помощьювызов метода, найденного в другом модуле (My::Session).Вот строка, генерирующая предупреждение в методе этого модуля (обратите внимание на ошибочный >):

my $disputes => dbh('b')->selectrow_hashref($query);

Что меня смущает, так это то, что предупреждение не ссылается на модуль, содержащий ошибочную строку (оно ссылается намодуль, вызывающий метод, My::Page).Вот полный вывод из Carp::Always;совершенно не упоминается My::Session:

[среда, 23 февраля, 17:44:29 2011] [предупреждать] [клиент --- .---. 94.159] mod_fcgid: stderr: Использование неинициализированного значения в числовом gt (>) в строке /path/to/My/Page.pm 65, реферер: https://testserver.domain.tld/help

[Ср. 23 февраля 17:44:29 2011] [warn][client ---.---. 94.159] mod_fcgid: stderr: \ tPage :: BUILD ('My :: Page :: Help = HASH (0xa7ce788)', 'HASH (0xa327904)') вызывается в / usr / lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Class/MOP/Method.pm строка 123, реферер: https://testserver.domain.tld/help

[ср. 23 февраля, 17:44:29 2011] [warn] [клиент --- .---. 94.159] mod_fcgid: stderr: \ tClass :: MOP :: Method :: execute ('Moose :: Meta :: Method = HASH (0x9fa357c)', 'My :: Page:: Help = HASH (0xa7ce788) ',' HASH (0xa327904) ') вызывается по адресу /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Moose/Object.pm строка 57, реферер:https://testserver.domain.tld/help

[Ср 23 Фев 17:44:29 2011] [warn] [client ---.---. 94.159] mod_fcgid: stderr: \ tMoose :: Object :: BUI, referer:https://testserver.domain.tld/help

[Ср. 23 февраля 17:44:29 2011] [предупредить] [клиент ---.---. 94.159] mod_fcgid: stderr: LDALL ('My :: Page :: Help = HASH (0xa7ce788)', 'HASH (0xa327904)'), вызываемый по адресу /usr/lib/perl5/site_perl/5.8.8 / i386-linux-thread-multi / Moose / Meta / Class.pm строка 278, реферер: https://testserver.domain.tld/help

[среда, 23 февраля, 17:44:29 2011] [предупреждение] [клиент ---.---. 94.159] mod_fcgid: stderr: \ tMoose :: Meta :: Class :: new_object ('Class :: MOP :: Class :: ANON :: SERIAL :: 1 = HASH (0xa3397c8) ',' HASH (0xa327904) ') вызывается в /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Moose/Object.pm строка 26, реферер: https://testserver.domain.tld/help

[Ср. 23 февраля 17:44:29 2011] [предупреждение] [клиент ---.---. 94.159] mod_fcgid: stderr: \ tMoose :: Object :: new ('My :: Page :: Help', 'HASH (0xa339d38)') вызывается в сгенерированном методе (неизвестное происхождение), строка 3, реферер: https://testserver.domain.tld/help

[Ср. 23 февраля 17:44:29 2011] [warn] [client ---.---. 94.159] mod_fcgid: stderr: \ tMy :: Page :: new ('My :: Page :: Suppo, реферер: https://testserver.domain.tld/help

[Ср. 23 февраля 17:44:29 2011][warn] [клиент --- .---. 94.159] mod_fcgid: stderr: rt ',' HASH (0xa339d38) ') вызывается в / path /в / My.pm, строка 44, реферер: https://testserver.domain.tld/help

[ср. 23 февраля 17:44:29 2011] [warn] [client ---.---. 94.159] mod_fcgid: stderr: \tMy :: start () вызывается в index.fcgi строке 9, реферер: https://testserver.domain.tld/help

Ответы [ 2 ]

2 голосов
/ 24 февраля 2011

Я предполагаю, что один из ваших аргументов - перегруженный объект, и эта перегрузка выдает ошибку. Проверьте, чтобы точно увидеть, что ваши аргументы:

print "$_: ", ref, $/ for $self, $self->path, $status;

Который должен напечатать что-то вроде:

HASH(0x12341234)=Self::Object: Self::Object
some/path:
4:

Если вместо этого вы получаете:

HASH(0x12341234)=Self::Object: Self::Object
some/path: Some::Object
4: Some::Other::Object

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

Вы также можете написать bool функцию, которая будет принудительно переводить значение в незагруженный бул:

sub bool {$_[0] ? 1 : 0}

А потом:

my $cond1 = bool $self->path ne 'contact_us';
my $cond2 = bool !grep { $status == $_ } 2, 3, 8;
if ($cond1 && $cond2) {

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

Это также может быть вызвано одной из прагм автобокса, таких как use bigint; или use bignum;, которые преобразуют буквенные числа, такие как 2, 3, 8, в перегруженные объекты. Действуют ли какие-либо подобные прагмы?

1 голос
/ 24 февраля 2011

Я почти уверен, что вы не получаете $ status, установленный должным образом где-то выше вставленного вами кода. Вы, вероятно, также используете более старую версию Perl, поскольку в ActiveState 5.12 на моем MBP она выведет имя переменной, которая не удалась, как это происходит в 5.10 под FreeBSD. В версии 5.8.8 моего VPS на основе Linux имя переменной не является частью сообщения об ошибке.

Было бы легче помочь с более чем несколькими строками кода, поскольку обычно первопричину такого рода ошибок можно найти не на линии, где программа умирает, а из-за переменная на самом деле не содержит то, что, как вы думаете, она содержит.

...