perl中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)編寫指令碼時,注意作用域,防止外部影響內部。
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;
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
call_local 20
20
9
可以看出,local函式在建立全域性變數的一個區域性例項後即可將它傳遞給任何子例程並繼續進行區域性初始賦值。運算子my以與local函式同樣的方法建立一次區域性例項,然而,由my建立的區域性例項不能傳遞給其它子例程,傳遞給子例程進行運算的將是全域性值而非區域性引用值。
當locla所在的子例程結束後,全域性變數的值又恢復為初始定義值。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24104518/viewspace-722945/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Perl中的變數作用範圍 local, my, our與全域性變數變數
- Spring中ref local=""與ref bean=""的區別SpringBean
- my.cnf中[mysql]與[mysqld]下引數的區別MySql
- LOCAL_SHARED_LIBRARIES 與 LOCAL_LDLIBS,LOCAL_LDFLAGS的區別
- global index & local index的區別Index
- 【Oracle】global index & local index的區別OracleIndex
- Javascript中“==”與“===”的區別JavaScript
- js中“==”與"==="的區別JS
- 解析MySQL 配置檔案 my.cnf / my.ini 區別MySql
- Java中(==)與equals的區別Java
- numpy中dot與*的區別
- Python中 ‘==‘ 與‘is‘的區別Python
- local_irq_disable和disable_irq的區別
- js中!和!!的區別與用法JS
- js中 let 與 var 的區別JS
- HTTP中GET與POST的區別HTTP
- ruby中的\z與\Z區別
- 陣列中&a與&a[0]的區別陣列
- MySQL語法中=與:=的區別MySql
- CSS中PX與EM的區別CSS
- HTML中ID與NAME的區別HTML
- vue中sass與SCSS的區別VueCSS
- jQuery中hover與mouseover與mouseenter的區別jQuery
- 內建系統賬戶:Local system/Network service/Local Service 區別
- Android中 @和?區別以及?attr/**與@style/**等的區別Android
- Java中類與物件的關係與區別Java物件
- JavaScript 中substr與 substring 的區別JavaScript
- EBS 中 adpatch 與 opatch 的區別
- 轉 shell中$(( )) 與 $( ) 還有${ }的區別
- Http中header與body的區別HTTPHeader
- PHP中explode與split的區別分析PHP
- nginx中的break與last指令區別NginxAST
- java中Map,List與Set的區別Java
- Java中Array與ArrayList的主要區別Java
- linux中fork()與vfork()的區別Linux
- rman 中delete 與delete force 的區別delete
- SQL中Having與Where的區別SQL
- C#中List與IList的區別C#