溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Perl閉包如何應(yīng)用

發(fā)布時間:2021-12-07 09:16:12 來源:億速云 閱讀:135 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Perl閉包如何應(yīng)用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

閉包的基本概念

閉包是可以包含自由(未綁定)變量的代碼塊;這些變量不是在這個代碼塊或者任何全局上下文中定義的,而是在定義代碼塊的環(huán)境中定義。“閉包”一詞來源于以下兩者的結(jié)合:要執(zhí)行的代碼塊(由于自由變量的存在,相關(guān)變量引用沒有釋放)和為自由變量提供綁定的計算環(huán)境(作用域)。在Scheme、CommonLisp、Smalltalk、Groovy、JavaScript、Ruby和Python等語言中都能找到對閉包不同程度的支持。

Perl閉包

閉包(closure)是個精確但又很難解釋的電腦名詞。在Perl里面,Perl閉包是以匿名函數(shù)的形式來實現(xiàn),具有持續(xù)參照位于該函數(shù)范圍之外的文字式變數(shù)值的能力。這些外部的文字變數(shù)會神奇地保留它們在閉包函數(shù)最初定義時的值(深連結(jié))。

如果一個程式語言容許函數(shù)遞回另一個函數(shù)的話(像Perl就是),Perl閉包便具有意義。要注意的是,有些語言雖提供匿名函數(shù)的功能,但卻無法正確處理閉包;Python這個語言便是一例。如果要想多了解閉包的話,建議你去找本功能性程式設(shè)計的教科書來看。Scheme這個語言不僅支援閉包,更鼓勵多加使用。
以下是個典型的產(chǎn)生函數(shù)的函數(shù):

subadd_function_generator{  returnsub{shift+shift};  }  $add_sub=add_function_generator();  $sum=&$add_sub(4,5);#$sum現(xiàn)在是9了

Perl閉包用起來就像是個函數(shù)樣板,其中保留了一些可以在稍後再填入的空格。add_function_generator()所遞回的匿名函數(shù)在技術(shù)上來講并不能算是一個閉包,因為它沒有用到任何位在這個函數(shù)范圍之外的文字變數(shù)。

把上面這個例子和下面這個make_adder()函數(shù)對照一下,下面這個函數(shù)所遞回的匿名函數(shù)中使用了一個外部的文字變數(shù)。這種指名外部函數(shù)的作法需要由Perl遞回一個適當(dāng)?shù)拈]包,因此那個文字變數(shù)在匿名函數(shù)產(chǎn)生之時的值便***地被鎖進閉包里。

submake_adder{  my$addpiece=shift;  returnsub{shift+$addpiece};  }  $f1=make_adder(20);  $f2=make_adder(555);

這樣一來&$f1($n)永遠會是20加上你傳進去的值$n,而&$f2($n)將永遠會是555加上你傳進去的值$n。$addpiece的值會在閉包中保留下來。
Perl閉包在比較實際的場合中也常用得到,譬如當(dāng)你想把一些程式碼傳入一個函數(shù)時:
my$line;
timeout(30,sub{$line=<STDIN>});
如果要執(zhí)行的程式碼當(dāng)初是以字串的形式傳入的話,即'$line=<STDIN>',那么timeout()這個假想的函數(shù)在回到該函數(shù)被呼叫時所在的范圍後便無法再擷取$list這個文字變數(shù)的值了。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Perl閉包如何應(yīng)用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細節(jié)
推薦閱讀:
  1. Python 閉包
  2. lua 閉包

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI