使用者函式
使用者函式又稱子程式(subroutine),在perl中用下面的結構來定義使用者函式:
sub 子程式名
這裡的子程式名與變數的取名規則類似。
以顯示歡迎詞的程式為例:
sub say_hello
使用者函式的定義可以位於程式的任何位置,比如說放在檔案的未尾。如果兩個子程式使用了相同的程式名, 後面的子程式將覆蓋前面子程式。
使用者函式中的變數預設為全域性變數,與其他程式共享。
使用者函式的呼叫:通過在子程式前加「&」呼叫,可在任一表示式內呼叫。 子程式中可以再呼叫另外的子程式。
呼叫使用者函式產生的結果稱為返回值(return value)。返回值是每次呼叫函式中最後乙個表示式的計算值。 以加法函式為例:
sub add_a_b
函式最後一條表示式為$a+$b,故返回值為$a+$b。以下是呼叫情況:
$a=5;
$b=6;
$c=&add_a_b; #$c的值為11
$d=5*&add_a_b; #$d的值為5*11即55
上述的函式功能與傳統直接寫在程式中沒什麼兩樣,如果加上引數傳遞就可以實現全新的功能了。 在perl中,如果函式呼叫後面跟著乙個用括號括起來的列表,則在函式呼叫期間該列表將被自動分配給以@_命名的特殊變數。 函式可以訪問該變數,從而確定引數的個數及賦值。
仍以加法函式為例:
sub add_a_b
$c=&add_a_b(5,6); #$c的值為11
$d=5*&add_a_b(2,3); #d的值為5*5即25
如何改變引數的個數呢?我們可以用迴圈的方式來實現:
sub add_all
$sum; #返回sum即總和的值
}$a=&add_all(3,4,5); #$a的值為3+4+5即12
$d=2*&add_all(1,2,3,4,5); #d的值為2*15即30
既然函式中的變數全為全程變數,那麼上述程式中若呼叫程式中含有$sum變數時將替換,這不是我們所要的。 那麼如何解決這一問題呢?
答案就是:使用區域性變數, 使用local()操作符就可實現此功能。在上面的程式中,只需在第一行$sum=0;前加入:
local($sum);
當函式執行時,$sum的全程變數的值被保留起來,同時建立乙個區域性變數$sum,退出函式add_all後將全程變數$sum的值恢復。如:
sub add_all
$sum; #返回sum即總和的值
}$sum=88; #$sum的原始值為88
print $sum; #顯示$sum的值即88
$a=&add_all(3,4,5); #$a的值為3+4+5即12
print $sum; #顯示$sum的值仍為88
比較:若未加入local($sum);行,最後一行的執行結果將為12。
下面再舉一例:計算十以內的加法,並以中文形式輸出。當超過十時輸出阿拉伯數字。如:輸入兩個數字,顯示「一加二等於三」。程式如下:
#/! /usr/bin/perl
sub cnumber
#主程式
print "請輸入乙個數:"
chop($num1=);
print "請再輸入乙個數:"
chop($num2=);
$msg=&chinese($num1)."加".&chinese($num2)."等於".
&chinese($num1+num2)."。\n"
print $msg; #列印$msg的值
其中$chinese($number)||number; 行的初級寫法為:
if ($chinese(number) else
看看執行結果:輸入2,3,顯示:"二加三等於五。";輸入3,12,顯示:"三加12等於15。"
Perl語言入門 08 自定義函式
由於公司需要,本人最近在學習perl這種指令碼語言,本文是我在學習perl的過程中總結出來的一些心得和筆記,希望能夠幫助也在學習perl的各位同僚。廢話不多說直接上乾貨!乾貨分割線 pe r l中,使用者定義的函式稱為子例程.子例程可以在任何位置被呼叫,包括在其他子例程中呼叫.建立函式 sub 函式...
自定義函式 Excel之自定義函式
在excel中,當系統函式不能滿足我們的需求時候,我們可以使用vba自定義函式,如抓取網頁資料,翻譯詞彙,手機號歸屬地查詢等。下面將介紹2個自定義函式,idymd函式 身份證年月日性別 通過身份證號,返回性別,出生年月日。語法 idymd id 引數 id,身份證號,預設身份證長度18位。vba 如...
perl自定義模組的呼叫!
週末沒事,看了下perl的書,剛開始不是很理解perl的自定義模組呼叫。剛弄明白,順便記錄下來!1 usr bin perl 2 push inc,pwd 3 use cocoa 4 cup new cocoa 第一行指出perl直譯器的位置,第二行中,將當前目錄加到路徑尋找列表 inc中供尋找包時...