perl中my與local的區別

物理狂人發表於2012-05-07

my: lexically scoped variable
local:Dynamically scoped variable

 

內部->外部:

(1)my和local都只在一個block裡有效,出去就失效;
(2)但是local的變數可以繼續在這個block中呼叫的子程式中存在;
(3)如果有與外界同名的變數,兩者在block退出後都不影響外界同名變數;

外部->內部:

(1)外部設定my、local、預設均隊內有效,但是同名變數外部my,在block內部local是不允許的。因為二者在block中呼叫的子程式中均有效,會衝突。

(2)如果在一個block中有一個my修飾的變數和外界的一個變數同名,而且又需要在這個block中使用外界變數時,兩個辦法:
第一個辦法,用main的package修飾這個變數名,$main::global
第二個辦法,用our修飾,our $global,那麼該block中接下來出現的所有$global都是外界的global

(3)編寫指令碼時,注意作用域,防止外部影響內部。


 

perl學習筆記1---local與my用法

      在函式定義中,使用my關鍵字來確保使用者定義函式中所使用的變數名不與任何其它同名的全域性變數衝突,它使其後面的變數成為通常語言所謂的local變數。預設情況下,perl函式中的變數是全域性變數。 local變數先save再store
$x = 9;
sub mm{
    print "$x\n";
}
sub gg_my{
    my $x = 11;
    print "call-my $x\n";
    mm;
}
sub gg_local {
    local $x = 20;
    print "call-local $x\n";
    mm;
}
gg_my;
gg_local;
print $x;
輸出結果是:
call_my 11
9
call_local 20
20
9
可以看出,local函式在建立全域性變數的一個區域性例項後即可將它傳遞給任何子例程並繼續進行區域性初始賦值。運算子my以與local函式同樣的方法建立一次區域性例項,然而,由my建立的區域性例項不能傳遞給其它子例程遞給子例程進行運算的將是全域性值而非區域性引用值。
當locla所在的子例程結束後,全域性變數的值又恢復為初始定義值。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24104518/viewspace-722945/,如需轉載,請註明出處,否則將追究法律責任。

相關文章