2012-07-29 5 views
7

pragma는 autodie과 유사하며 어휘에 따라 범위가 지정됩니다.어휘로 범위가 지정된 pragmas

{ 
use autodie; 
.. 
.. 
} 
# Can die here 

이 사항은 use이로드 된 모든 모듈에 적용됩니까? 은 내가 아는 한, 사용과 거의 동일합니다

BEGIN { 
require autodie; 
autodie->import(LIST); 
} 

시작

이 컴파일시에 발생, 어휘 범위되지 않은 요구, 그래서 방법은 그 범위에 대한 그 autodie 알고 온?

감사합니다,

autodie의 백엔드는 Fatal.pm의 수입 방법에서
+0

뭔가하고 싶은게 있니? 아니면 순전히 호기심에서 벗어난 것입니까? – ikegami

답변

10

짧은 대답은 pragmatic modules가 명시 적으로 그런 식으로 행동 및 기능을 사용하거나 사용하지 않도록하기 위해 컴파일 시간 동안 마법의 내부 변수 $^H%^H를 사용하도록 작성된 어휘 적 범위의 것입니다.

컴파일러는 이러한 변수를 암시 적으로 지역화하여 부분을 재생하므로 코드 블록을 컴파일 할 때 해당 값이 처음에 있던 값으로 복원됩니다. 그런 식으로 어휘 의미론의 기초를 제공합니다.

원래는 $^H 변수 만 사용할 수있었습니다. 여기에는 컴파일하는 동안 언제든지 사용할 수있는 컴파일러 옵션을 지정하는 비트 마스크가 포함되어 있습니다. 이 때문에 작성 될 수있는 유일한 어휘 pragmas는 $^H에 정의 된 일련의 마법 비트를 조작 한 것입니다.

나중에 %^H 해시가 도입되었으며 모든 pragma가 이제이 pragma의 이름으로 시작하는 키를 사용하여이 해시에 값을 저장할 수 있습니다. 컴파일러는 스칼라와 같은 방식으로 해시를 지역화하므로 모든 pragma는 여기에 자동으로 범위 정보를 저장할 수 있습니다.

autodie 모듈은 이러한 변수 중 하나를 조작하지 않지만 모든 노력을 다하는 모듈 Fatal을 하위 클래스로 하위 클래스합니다. 어떤 연산자가 치명적인지 추적하기 위해 %^H을 사용하고 컴파일러가 블록의 끝에이 정보를 무시합니다.

+1

perlpragma에 대한 언급은 좋을 것입니다. – ysth

7

이 즐길 :

그래서 대답은 정말이
# Dark magic to have autodie work under 5.8 
# Copied from namespace::clean, that copied it from 
# autobox, that found it on an ancient scroll written 
# in blood. 

# This magic bit causes %^H to be lexically scoped. 
$^H |= 0x020000; 

자신의 어휘를 인식하여 수입을 만들 수있는 방법입니다 범위지만, perl의 내장과 깊이 얽혀 있고 일반 프로그래머가 사용할 수있는 것은 아닙니다.

+1

아니요, 5.10 이상이 아니라 5.8에서'%^H' 기반 pragma가 작동하도록하는 추가 단계 만 설명합니다. – ysth

+0

그래, 나는 정말로 그 중 가장 무서운 부분을 보여 주면서 관련된 마법에 대한 일반적인 느낌을 전달했다. 어휘 플러그인이 "정상적인"모듈 가져 오기 기술로 구현 될 수 없다는 질문자의 느낌을 확인한다는 의미에서의 대답이었습니다. –

+1

하지만 완전히 잘못되었습니다 ... 쉽게 구현할 수 있습니다. http://perldoc.perl.org/perlpragma.html을 참조하십시오. – ysth

1

흥미로운 것은 require이 아닙니다. pluma가 import에서하는 것입니다.

대부분 (모두?) pragma는 $^H 또는 %^H을 사용합니다. 구문 분석기는이를 구문 분석중인 범위로 현지화합니다. 즉, 예전 값으로 복원합니다.

예를 들어 strict을 가져옵니다. 해당 import$^H을 수정합니다. $^H에는 컴파일러에게 동작 방법을 지시하는 일련의 플래그가 들어 있습니다.

$ perl -e' 
    BEGIN { printf "%04X\n", $^H } 
    { 
     use strict; 
     BEGIN { printf "%04X\n", $^H } 
    } 
    BEGIN { printf "%04X\n", $^H } 
' 
0100 
0702 
0100 

$^H

펄의 사용을 위해 예약 있지만, 유사 %^H는 일반적으로 사용할 수 있습니다 지역화됩니다. 예를 들어, feature::qw_commentrequire에 의해로드 될 때 한 번 구문 분석기에 연결되지만 $^H{'feature::qw_comments::'}이 참일 때까지 아무 작업도 수행하지 않습니다. 수입은

와 같습니다.
sub import { $^H{'feature::qw_comments::'} = 1; } 
관련 문제