2012-04-01 5 views
0

Я не понимаю, почему следующее:Почему оценка короткого замыкания Perl приводит к проверке rvalue?

my $err = undef; 

while(1){ 
    if($err && ($err->code == 502)) { 
    [...] 
    } 
    [...] 
    eval {...} 
    $err = [email protected]; 
} 

результаты в Can't call method "code" on an undefined value at ./filename.pl line 74. в PERL v5.8.8. Другими словами: почему perl выполняет второе логическое выражение, даже если конструктор OP1 && OP2не может стать истинным, потому что первый операнд имеет значение false (undef).

даже более подробный вариант if((defined $err) && ($err->code == 502)) дает тот же результат.

Заранее спасибо :)

+1

Я не могу воспроизвести это (на 5.10, правда). Можете ли вы дать небольшую, но полную программу, которая демонстрирует проблему? – ruakh

+0

Мой комментарий содержит полный скрипт Perl. Я не знаю, как это сделать в этом столбце комментариев, поэтому позвольте мне опубликовать его как ответ ниже. – thb

+0

извините, но программа использует Net :: Twitter (довольно много deos), и при использовании сокращенного фрагмента кода это действительно правильно ... пожалуйста, будьте терпеливы, я попробую найти образец – Julian

ответ

1

Для получения информации, когда я запускаю свой код следующим образом на 5.10.1 интерпретатор Perl, я не получаю сообщение об ошибке на всех. (Это действительно больше комментариев, чем ответ, только он не помещается в поле комментария. Он не нуждается в upvote.)

#!/usr/bin/perl 
use warnings; 
use strict; 
use integer; 

my $err = undef; 

while(1){ 
    if($err && ($err->code == 502)) { 
    warn; 
    } 
    eval {1}; 
    $err = [email protected]; 
} 
1

Если UNDEF как вы говорите, что версия Perl или ваша сборка perl является ошибкой, если вы получаете это поведение от этого кода. Ничего подобного.

Но это может быть не undef. Имейте в виду, что ошибка может возникнуть не от первого прохода цикла. $err может содержать объект с перегруженными операторами с ошибкой (например, непоследовательными булевыми и строковыми перегрузками). Что показывает следующее шоу?

use Devel::Peek; 
Dump($err); 
+0

Это действительно странно, если я выполняю только соответствующий фрагмент, поведение будет таким же ожидаемым, как только я запустил весь скрипт, который слишком длинный для публикации, возникает ошибка ... Я в настоящее время строю 5.14, давайте посмотрим, поможет ли это – Julian

+0

@Julian Кессель, Обновлено – ikegami

+0

линия показывает: 'SV = NULL (0x0) в 0xec61670 REFCNT = 1 ФЛАГИ = (PADBUSY, PADMY) ' – Julian

0

Причина $ ERR ($ @) был явно не undef после eval{} было то, что породила функцию в eval возвратил ошибку обусловленно его неспособности прочитать файл, который не был пойман sourrounding код :(

Спасибо @ikegami за предложение, я получил след используя дамп в конце концов.

Таким образом, решение проблемы находится вне democode, извините за это. Я просто должен был создать файл ...

Смежные вопросы