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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring中ref local=""與ref bean=""的區別SpringBean
- my.cnf中[mysql]與[mysqld]下引數的區別MySql
- Javascript中“==”與“===”的區別JavaScript
- Python中 ‘==‘ 與‘is‘的區別Python
- 解析MySQL 配置檔案 my.cnf / my.ini 區別MySql
- local_irq_disable和disable_irq的區別
- Java中(==)與equals的區別Java
- 【Python】pyenv的版本控制及global、shell、local命令區別Python
- js中 let 與 var 的區別JS
- vue中sass與SCSS的區別VueCSS
- js中!和!!的區別與用法JS
- JavaScript 中substr與 substring 的區別JavaScript
- Vue 中ref()與 reactive() 的區別VueReact
- My local classic rock station incorporated music from the 1990s
- spring中的FactoryBean與ObjectFactory的區別SpringBeanObject
- Java中類與物件的關係與區別Java物件
- vue中 lang="ts"與js的區別VueJS
- StringUtils類中isEmpty與isBlank的區別
- Vue的mode中 hash 與 history 的區別Vue
- ??與?:的區別
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- JPA中PersistenceUnit與PersistenceContext區別Context
- devexpress中 cxTreeList 與 cxVirtualTreeList 區別devExpress
- Java中replace與replaceAll區別Java
- jQuery中onload與ready區別jQuery
- Node中Exports與module.export的使用與區別Export
- 資料庫中where與having的區別資料庫
- sklearn 中fit_tansform 與 transform的區別ORM
- Python中eval與exec的使用及區別Python
- springdatajpa 中get××方法與find××方法的區別Spring
- Linux中檔案與目錄的區別Linux
- table中cesllspacing與cellpadding的區別詳解padding
- CSS中 offsetLeft 與style.left 的區別CSS
- CSS中的class與id區別及用法CSS
- JavaScript中apply、call、bind的區別與用法JavaScriptAPP
- Nodejs中process.cwd()與__dirname的區別NodeJS
- jquery中append()方法與after()方法的區別jQueryAPP
- erc721中safeMint與mint的區別
- ScheduledExecutorService中scheduleAtFixedRate方法與scheduleWithFixedDelay方法的區別