Perl의 어휘 범위 pragma는 어떻게 구현됩니까?
-
13-12-2019 - |
문제
프라그마와 같은 autodie
, 문서에 따르면 어휘 범위가 지정됩니다.
{
use autodie;
..
..
}
# Can die here
이것이 로드된 모든 모듈에 적용됩니까? use
?내가 아는 한, use
다음과 거의 동일합니다.
BEGIN {
require autodie;
autodie->import(LIST);
}
BEGIN
컴파일 타임에 발생하며 require는 어휘 범위가 지정되지 않습니다.그래서 어때? autodie
그 범위를 알고 있나요?
해결책
짧은 대답은 어휘 정확히 scoped 실용적인 모듈 가 해당 방식으로 작동하도록 명시 적으로 작성되고 마법의 내부 변수 $^H
및 COMPILE 시간 동안 특징을 활성화 및 비활성화하는 동안
컴파일러는 이러한 변수를 암시 적으로 현지화함으로써 부품을 재생하여 코드 블록을 작성한 것으로 구성된 마지막 부분에 그 값이 복원됩니다. 그런 식으로 어휘적인 의미의 기초를 제공합니다.
원래 %^H
변수 만 사용할 수있었습니다. 여기에는 컴파일하는 동안 언제든지 어떤 컴파일러 옵션을 사용할 수 있는지 지시하는 비트 마스크가 포함되어 있습니다. 그게 쓰여질 수있는 유일한 어휘 Pragmas는 $^H
에서 정의 된 마법의 비트 세트를 조작 한 것들었습니다.
나중에 $^H
해시가 도입되었으며 모든 Pragma는 이제이 해시의 값을 Pragma의 이름으로 시작하는 키로 값을 저장할 수 있습니다. 컴파일러는 해시를 스칼라와 같은 방식으로 로컬로 채우기 때문에 모든 PRAGMA는 여기에 자동으로 범위 지정된 상태 정보를 저장할 수 있습니다.
%^H
모듈은 이러한 변수 중 하나를 조작하지 않지만 autodie
모듈을 서브 클래스합니다. 힘든 일. Fatal
를 사용하여 어떤 연산자가 치명적 이었는지 추적하고 컴파일러에서 블록의 끝에이 정보를 버리고이 정보를 삭제합니다.
다른 팁
Fatal.pm
백엔드 인 autodie
의 가져 오기 방법에서 다음을 즐기십시오.
# 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의 배짱이 깊게 얽혀 있으며 일반적인 프로그래머가 사용하지 않는 것이 아닙니다.
그렇지 않다 require
그 흥미 롭군요;이것이 pragma가 하는 일입니다 import
.
대부분의 (모두?) pragma는 $^H
또는 %^H
.파서는 이를 파싱되는 범위로 지역화합니다. 즉, 이전 값으로 복원합니다.
가져가다 엄격한, 예를 들어.그것은 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
Perl용으로 예약되어 있지만 비슷하게 현지화되어 있습니다. %^H
일반 용도로 사용 가능합니다.예를 들어, 기능::qw_comment 파서가 로드되면 파서에 한 번 연결됩니다. require
, 하지만 다음 외에는 아무것도 하지 않습니다. $^H{'feature::qw_comments::'}
사실이다.수입품은 다음과 같습니다.
sub import { $^H{'feature::qw_comments::'} = 1; }