이 프로그램이 왜 유효합니까? 구문 오류를 만들려고했습니다.
Windows 7 에서 ActiveState의 32 비트 ActivePerl 5.14.2를 실행 하고 있습니다. 구문 오류로 체크인되는 프로그램을 감지하기 위해 Git 사전 커밋 후크를 사용하고 싶었습니다. (어쨌든 나는 방금 그런 나쁜 커밋을 수행했습니다.) 그래서 테스트 프로그램으로 나는 이것을 무작위로 적어 넣었습니다.
use strict;
use warnings;
Syntax error!
exit 0;
그러나 경고없이 컴파일 및 실행되며 종료시 errorlevel은 0입니다. 이 유효한 구문은 어떻습니까?
Perl에는 "간접 메소드 표기법"이라는 구문이 있습니다. 그것은 허용
Foo->new($bar)
로 작성
new Foo $bar
그래서 그것은
Syntax error ! exit 0;
와 같다
error->Syntax(! exit 0);
또는
error->Syntax(!exit(0));
유효한 구문 일뿐만 아니라 실행 된 첫 번째 항목이이므로 런타임 오류가 발생하지 않습니다 exit(0)
.
이유를 모르겠지만 이것이 Perl이 만든 것입니다.
perl -MO=Deparse -w yuck
BEGIN { $^W = 1; }
use warnings;
use strict 'refs';
'error'->Syntax(!exit(0));
yuck syntax OK
파서는 당신이 객체 에서 메소드 Syntax
를 호출한다고 생각하는 것 같습니다 error
... 정말로 이상합니다!
오류가 발생하지 않는 이유는 첫 번째로 실행 된 코드가
exit(0);
첫 줄에 세미콜론이 없기 때문에 :
Syntax error!
컴파일러는 ( 이것은 not
연산자가 !
던져진 서브 루틴 호출이라고 잘못 추측합니다 .) 그런 다음이 서브 루틴에 대한 인수를 실행 exit(0)
하여 프로그램이 종료되고 오류 레벨을 0으로 설정합니다. 더 이상 런타임 오류가보고되지 않습니다.
exit(0)
다음과 같이 변경 print "Hello world!"
하면 오류가 발생합니다.
Can't locate object method "Syntax" via package "error" ...
오류 수준이 설정됩니다.
> echo %errorlevel%
255
위에서 언급했듯이 이것은 간접 메소드 호출 표기법으로 인해 발생합니다. 당신은 이것에 대해 경고 할 수 있습니다 :
use strict;
use warnings;
no indirect;
Syntax error!
exit 0;
생산 :
Indirect call of method "Syntax" on object "error" at - line 5.
여기에는 간접 CPAN 모듈 이 필요합니다 .
no indirect "fatal";
프로그램을 죽이는 데 사용할 수도 있습니다 (이것이 내가하는 일입니다)
시도 펄 6 , 더 쉽게 당신의 기대를 충족 할 것 같다 :
===SORRY!=== Error while compiling synerror.p6
Negation metaoperator not followed by valid infix
at synerror.p6:1
------> Syntax error!⏏<EOL>
expecting any of:
infix
infix stopper
'development' 카테고리의 다른 글
EditText 커서 색상 설정 (0) | 2020.02.13 |
---|---|
MySQL : @ 변수와 변수 (0) | 2020.02.13 |
HTML에서 단어 줄 바꿈을 해제하는 방법은 무엇입니까? (0) | 2020.02.13 |
Eclipse에서 강조 표시 범위 지우기 (0) | 2020.02.13 |
CSS 강제 이미지 크기 조정 및 가로 세로 비율 유지 (0) | 2020.02.13 |