Perl之my與local

   在函數定義中,使用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所在的子例程結束後,全局變量的值又恢復爲初始定義值。

my和local的區別

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)編寫腳本時,注意作用域,防止外部影響內部。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章