[英]Perl `defined' and `undef' subroutine scope
請看下面的代碼:
use strict;
use warnings;
print "subroutine is defined\n" if defined &myf;
myf();
sub myf
{
print "called myf\n";
}
undef &myf;
#myf();
print "now subroutine is defined\n" if defined &myf;
輸出是
subroutine is defined
called myf
第一個print
語句可以打印,這是否意味着解釋器(或編譯器?)進一步查看並查看子例程定義? 如果是這樣,為什么它沒有看到undef &myf;
作為第二個print
聲明?
謝謝
這與范圍無關,但與編譯時和運行時有關 。 這是一個簡化的解釋。
Perl解釋器最初將掃描您的代碼,並遵循任何use
語句或BEGIN
塊。 此時,它會看到所有sub
,並在各自的包中記下它們。 所以現在你的符號表中有一個&::myf
。
當編譯時間到達程序結束時,它將切換到運行時。
那時,它實際上運行代碼。 如果定義了&myf
則執行第一個print
語句。 我們知道它是,因為它在編譯時設置。 然后Perl調用該函數。 一切都很好。 現在你在符號表中undef
該條目。 這也發生在運行時。
之后, defined &myf
返回false,因此不會打印。
你甚至在代碼中第二次調用myf()
,但是注釋掉了。 如果刪除注釋,它會抱怨未定義的子例程和main :: myf被調用 。 這對發生的事情有很好的暗示。
所以實際上它在代碼中沒有向前或向后看。 它已經在那時完成了掃描代碼。
請注意,實際undef
函數的用例並不多。 除非您想手動清理命名空間,否則我不明白為什么要刪除它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.