소스와 컴파일 단계에서 정확하게 어디에서 use
이 정의되어 있는지 알 수 있습니까? 나는 그것을 보지 못했고 CORE::GLOBAL::use
을 찾고 있었고 그것을 찾고자하는 방법을 확신하지 못했습니다. 꽤 모호한 용어입니다.펄 소스 코드에서`use`는 어디에 정의되어 있습니까?
답변
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 블록을 만듭니다. veop
및 imop
변수 요청 요소 버전을 확인하거나 가져 오는 연산 코드를 보유 할 수있다 :
/* 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 소스에 :
CORE
입니다.
perl -w -E 'CORE::use Data::Dumper; print Dumper("a")'
왜 그런 행동이 있는지 모르겠지만 @amon이 위의 주석에 맞다고 생각합니다. C에서 수행중인 작업을 확인하기위한 코드를보고 싶습니다. 사용자가 관찰 한 내용이 환상 일 뿐이므로 사람들이 프로세스가 제정신이고 단순하다고 생각할 수 있다고 생각합니다. –
그것은 좋은 추측 이었지만,'CORE ::'의사 - 네임 스페이스는 파서의 아주 초기에 처리됩니다. 'CORE ::'로 시작하는 기본 단어는 일반적인 키워드와 동일합니다. 따라서'CORE :: use'는 서브 루틴이 아니며 (예를 들어, 참조 할 수는 없습니다), 일반적인'use' 키워드와 똑같은 동작을합니다. 이것은 파서를 통해 작동하고 패키지 이름 검색을 통해서가 아니기 때문에'42 CORE :: if $ x'라고 말할 수도 있습니다! – amon
@amon 여기에 용이 있습니다. – simbabque
- 1. Enum.values ()는 어디에 정의되어 있습니까?
- 2. gcvt 또는 gcvtf는 gcc 소스 코드에서 어디에 정의되어 있습니까?
- 3. Reads.at는 어디에 정의되어 있습니까?
- 4. glSwapBuffers는 어디에 정의되어 있습니까?
- 5. python 소스 코드에서 math.exp()가 정의되어 있습니까?
- 6. glTextureVertexPointer는 어디에 정의되어 있습니까?
- 7. 조치 메소드 "setElementClass"는 어디에 정의되어 있습니까?
- 8. 기본 Yii 개념 : $는 어디에 정의되어 있습니까?
- 9. fetch() 및 FormData()는 어디에 정의되어 있습니까?
- 10. 'links'는 어디에 정의되어 있습니까?
- 11. $ 행은 어디에 정의되어 있습니까?
- 12. Widget.Material.Light.TextView.ListSeparator는 어디에 정의되어 있습니까?
- 13. HTML 코드에서 "왼쪽 절반"의 CSS 태그는 어디에 정의되어 있습니까?
- 14. ERROR_PENDING은 어디에 정의되어 있습니까?
- 15. DIR은 어디에 정의되어 있습니까?
- 16. 스타일은 어디에 정의되어 있습니까?
- 17. copy_to_user는 어디에 정의되어 있습니까?
- 18. tf.nn.l2_loss는 어디에 정의되어 있습니까?
- 19. Rails.application은 어디에 정의되어 있습니까?
- 20. GL_UNSIGNED_INT_8_8_8_8_REV는 어디에 정의되어 있습니까?
- 21. ConfigDSN은 어디에 정의되어 있습니까?
- 22. android.camera.NEW_PICTURE는 어디에 정의되어 있습니까?
- 23. 처음에 PYTHONPATH가 어디에 정의되어 있습니까?
- 24. scalaz 소스 코드에서 @> 유형은 어디에 있습니까?
- 25. Wix - HttpExtension은 어디에 정의되어 있습니까?
- 26. 핵심 애니메이션은 어디에 정의되어 있습니까?
- 27. /xstrtoul()은 어디에 정의되어 있습니까?
- 28. UDP_TABLE_CLASS 값은 어디에 정의되어 있습니까?
- 29. std :: copy_exception은 어디에 정의되어 있습니까?
- 30. DataTable 옵션은 어디에 정의되어 있습니까?
'use'는 런타임 효과가있는 함수/연산자가 아닙니다. 대신, 그것은'require'를하는 암시 적 BEGIN 블록이며, 수입이나 버전 검사를 수행 할 수도 있습니다. 따라서 파싱 코드와 매우 비슷하게 "정의"되어있을 것입니다. – amon
물건을 내리기 위해 아직 탐험 중이라면 필요한 것을 조사해야한다고 생각합니다. p5p 메일 링리스트에서 아직 귀하의 요구 사항을 물어 보셨습니까? – simbabque