Вот как парсер видит код:
try({ ... }, catch(Error, with({ ... }, my $endtime = Time::HiRes::time)));
Это означает, что он передает результат установки $endtime
в Time::HiRes::time
как второй аргумент подпрограммы with BLOCK
. Глядя на источник Error.pm
, я вижу:
sub with (&;$) {
@_
}
Что означает with BLOCK,SCALAR
- допустимый список аргументов. Все, что он делает, это передает аргументы до catch
, что интерпретирует my $endtime = Time::HiRes::time
как $clauses
. catch
само возвращает $clauses
, что превращает весь оператор в:
try({ ... }, my $endtime = Time::HiRes::time);
try
предполагает, что $clauses
является хеш-кодом, как вы можете видеть по вызову
$clauses->{'finally'}->()
if(defined($clauses->{'finally'}));
Таким образом, Perl пытается использовать значение Time::HiRes::time
в качестве хэш-ссылки, что, безусловно, не может, поскольку на самом деле это скаляр со значением «1316135985.90893».
Итак, точка с запятой в конце блока catch
.