2017-10-20 2 views
3

소스와 컴파일 단계에서 정확하게 어디에서 use이 정의되어 있는지 알 수 있습니까? 나는 그것을 보지 못했고 CORE::GLOBAL::use을 찾고 있었고 그것을 찾고자하는 방법을 확신하지 못했습니다. 꽤 모호한 용어입니다.펄 소스 코드에서`use`는 어디에 정의되어 있습니까?

+3

'use'는 런타임 효과가있는 함수/연산자가 아닙니다. 대신, 그것은'require'를하는 암시 적 BEGIN 블록이며, 수입이나 버전 검사를 수행 할 수도 있습니다. 따라서 파싱 코드와 매우 비슷하게 "정의"되어있을 것입니다. – amon

+1

물건을 내리기 위해 아직 탐험 중이라면 필요한 것을 조사해야한다고 생각합니다. p5p 메일 링리스트에서 아직 귀하의 요구 사항을 물어 보셨습니까? – simbabque

답변

7

use 구문 해석기 (perly.y)에 정의되어있다. 발췌 :

| USE startsub 
     { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } 
    BAREWORD BAREWORD optlistexpr ';' 
     { 
      SvREFCNT_inc_simple_void(PL_compcv); 
      utilize($1, $2, $4, $5, $6); 
      parser->parsed_sub = 1; 
      $$ = NULL; 
     } 

yacc를 모르고, 나는 그것이 무엇을하고 있는지 모른다.

utilize()의 기능은 op.c에서 Perl_utilize()입니다. 이 코드는 require을 포함하는 BEGIN 블록을 만듭니다. veopimop 변수 요청 요소 버전을 확인하거나 가져 오는 연산 코드를 보유 할 수있다 :

/* Fake up the BEGIN {}, which does its thing immediately. */ 
newATTRSUB(floor, 
    newSVOP(OP_CONST, 0, newSVpvs_share("BEGIN")), 
    NULL, 
    NULL, 
    op_append_elem(OP_LINESEQ, 
     op_append_elem(OP_LINESEQ, 
      newSTATEOP(0, NULL, newUNOP(OP_REQUIRE, 0, idop)), 
      newSTATEOP(0, NULL, veop)), 
     newSTATEOP(0, NULL, imop))); 

링크를 Github의 거울에 v5.26.0 소스에 :

-1

CORE입니다.

perl -w -E 'CORE::use Data::Dumper; print Dumper("a")'

+0

왜 그런 행동이 있는지 모르겠지만 @amon이 위의 주석에 맞다고 생각합니다. C에서 수행중인 작업을 확인하기위한 코드를보고 싶습니다. 사용자가 관찰 한 내용이 환상 일 뿐이므로 사람들이 프로세스가 제정신이고 단순하다고 생각할 수 있다고 생각합니다. –

+0

그것은 좋은 추측 이었지만,'CORE ::'의사 - 네임 스페이스는 파서의 아주 초기에 처리됩니다. 'CORE ::'로 시작하는 기본 단어는 일반적인 키워드와 동일합니다. 따라서'CORE :: use'는 서브 루틴이 아니며 (예를 들어, 참조 할 수는 없습니다), 일반적인'use' 키워드와 똑같은 동작을합니다. 이것은 파서를 통해 작동하고 패키지 이름 검색을 통해서가 아니기 때문에'42 CORE :: if $ x'라고 말할 수도 있습니다! – amon

+1

@amon 여기에 용이 있습니다. – simbabque

관련 문제