簡體   English   中英

Perl`defined'和`undef'子例程范圍

[英]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被調用 這對發生的事情有很好的暗示。

所以實際上它在代碼中沒有向前或向后看。 它已經在那時完成了掃描代碼。


perlmod解釋不同的階段。

請注意,實際undef函數的用例並不多。 除非您想手動清理命名空間,否則我不明白為什么要刪除它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM