2017-10-20 54 views
3

有沒有人知道在源代碼和編譯階段use中的確切位置?我沒有看到它尋找CORE::GLOBAL::use,我不確定如何潛水尋找它。這是一個非常模糊的術語。perl源代碼中定義了`use`的用途?

+3

'use'不是具有任何運行效果的函數/運算符。相反,它是一個隱含的BEGIN塊,它執行'require',並可能執行導入或版本檢查。所以它可能被「定義」得非常接近解析代碼。 – 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()功能是Perl_utilize()op.c。此代碼創建一個包含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在上面的評論中是正確的。我只想看看代碼,看看它在做什麼。我認爲你所觀察到的只是一種幻覺,所以人們可以認爲這個過程是理智和簡單的。 –

+0

這是一個很好的猜測,但'CORE ::'僞名稱空間在解析器中很早就被處理了。以'CORE ::'開頭的裸字符與普通關鍵字相同。所以'CORE :: use'不是一個子例程(例如,你不能引用它),但其行爲與普通的'use'關鍵字完全相同。因爲這是通過解析器工作的,而不是通過包名查找,你甚至可以說'42 CORE :: if $ x'! – amon

+1

@amon這裏有龍。 – simbabque

相關問題