문제

프라그마와 같은 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; }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top