Я использую ActiveState 32-битный ActivePerl 5.14.2 в Windows 7. Я хотел возиться с ловушкой Git pre-commit, чтобы обнаружить программы, проверенные на наличие синтаксических ошибок. (Каким-то образом мне просто удалось сделать такой неудачный коммит.) Так что в качестве тестовой программы я случайно набросал это:
use strict;
use warnings;
Syntax error!
exit 0;
Однако он компилируется и выполняется без предупреждений, а уровень ошибки равен нулю при выходе. Как этот правильный синтаксис?
no indirect
чтобы те не происходилиwhatever / 25 ; # / ; die "this dies!";
Ответы:
Perl имеет синтаксис, называемый «косвенная запись метода». Это позволяет
быть написанным как
Так что значит
такой же как
или
Это не только допустимый синтаксис, он не приводит к ошибке во время выполнения, потому что первое, что выполняется, это
exit(0)
.источник
!exit(0)
может быть ошибкой типа,!$x
поскольку ни один из них не напечатан.new Class
иprint $fh ...
вместоClass->new(...)
и$fh->print(...)
. Я предоставлю вам, что это вызывает странные сообщения об ошибках, хотяЯ не знаю почему, но вот что делает Perl:
Кажется, что парсер думает, что вы вызываете метод
Syntax
дляerror
-объекта ... Странно!источник
exit(0)
сначала выполняется оценка, заставляя программу завершиться, прежде чем она попытается передать результат'error'->Syntax()
.new Class
вместо «как»Class->new()
. Для вызова методаSyntax
выполняетсяexit
функция, поэтому ошибка времени выполнения никогда не возникает.use strict; use warnings; error->Syntax(! print "hi");
Выход: синтаксис Ok для perl -MO = Deparse также, но сuse warnings
этим, вероятно, следует что-то сказать, поскольку он может выяснить, что он не загружается. Вместо этого он выдает ошибку времени выполнения "Не удается найти метод объекта ..".Причина, по которой вы не получаете ошибку, состоит в том, что первый исполняемый код
Потому что у вас не было точки с запятой в первой строке:
Компилятор догадывается (неверно), что это вызов подпрограммы с добавленным
not
оператором!
. Затем он выполнит аргументы этой подпрограммы, что и происходитexit(0)
, после чего программа завершает работу и устанавливает уровень ошибки равным 0. Ничего больше не выполняется. , так что больше никаких ошибок времени выполнения не сообщается.Вы заметите, что если вы перейдете на что-
exit(0)
то подобное,print "Hello world!"
вы получите ошибку:и ваш уровень ошибки будет установлен:
источник
>The compiler will guess (incorrectly)
Компилятор не может ничего сделать неправильно.Как отмечено выше, это вызвано косвенной нотацией вызова метода. Вы можете предупредить об этом:
Производит:
Это требует косвенного модуля CPAN .
Вы также можете использовать,
no indirect "fatal";
чтобы заставить программу умереть (это то, что я делаю)источник
Попробуйте Perl 6 , кажется, он с большей готовностью оправдает ваши ожидания:
источник
TLDR; Едва
источник