Почему оценка Perl короткого замыкания приводит к проверке значения? - PullRequest
0 голосов
/ 02 апреля 2012

Я не понимаю, почему следующее:

my $err = undef;

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

приводит к 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)) дает тот же результат.

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

Ответы [ 3 ]

1 голос
/ 02 апреля 2012

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

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

use Devel::Peek;
Dump($err);
1 голос
/ 02 апреля 2012

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

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

my $err = undef;

while(1){
  if($err && ($err->code == 502)) {
    warn;
  }
  eval {1};
  $err = $@;
}
0 голосов
/ 09 апреля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...