子例程,函式
子例程,函式的作用域是指在程式中能夠看到它的位置範圍。子例程是全域性的,可以放在指令碼中的任意位置,甚至放在其他指令碼檔案中。當使用來自其他檔案的子例程時,應當使用關鍵字do,require或use將它載入到指令碼裡。若要呼叫乙個子例程,使用者可以在子例程前加上&符號,或在子例程前加上do關鍵字,也可以在子例程名後面加上一組括號。如果使用了向前引用(forward reference),在呼叫子例程時就不需要提供&或括號。
1 subroutine declaration:2sub
subroutine_name;
3 subroutine definition:
4sub
subroutine_name
5 subroutine call:6do
subroutine_name;
7 &subroutine_name;
8subroutine_name();
9subroutine_name;
10 subroutine call with parameters:
11 &subroutine_name( parameter1,parameter2,.......);
12 subroutine_name( parameter1,parameter2,.......);
示例**:
1#!/user/bin/perl23
subgreetme47
8 &greetme if
defined &greetme; #
使用defined函式檢查子例程是否已經定義。在使用子例程名時,要求必須提供&標記。910
"program continues ....\n";
1112 &greetme;
1314
bye();
15 &bye;16#
bye; 此種方式呼叫需使用向前引用,類似c程式中的宣告。
17sub
bye;
18bye;
1920
subbye
2124
25bye();
26 &bye;
27 bye;
執行結果:
1 welcome,valkommen till,bienvenue!2 program continues ....
3 welcome,valkommen till,bienvenue!
4 bye,adjo,adieu.
5 bye,adjo,adieu.
6 bye,adjo,adieu.
7 bye,adjo,adieu.
8 bye,adjo,adieu.
9 bye,adjo,adieu.
引數傳遞
函式把接收到的引數儲存到特殊的perl陣列@_中,其中每個元素($_[0],$_[1],.....)稱作乙個引數。不論引數是標量型還是陣列型的,使用者把引數傳給子例程時,perl預設按引用的方式呼叫它們。使用者可以通過改變@_陣列中的值來改變相應實際引數的值。
示例**:
1#!/usr/bin/perl23
subparams414
}1516@n=(1,2,3,4,5
);17 params(@n
);18
"black in main\n";
19print
"the new values are @n \n
";
執行結果:
1 the values in the @_array are 123452 the first value is 1
3 the last value is 5
4 the value is 6
5 the value is 7
6 the value is 8
7 the value is 9
8black in main
9 the new values are 678
95#前四個引數值已經改變,最後乙個引數值沒有發生變化,因為子例程中執行了pop(@_).
local與my區別
任何使用local函式宣告的變數都是動態拷貝的。該變數不但在建立它的塊中可見,而且對於任何從該**塊呼叫的函式中也是可見的。與local函式宣告的變數不同,my函式宣告得到的所有變數都只在宣告它的子例程中可見,對於該子例程呼叫的任何其他子例程都是不可見的
內部->外部:
1)my和local都只在乙個block裡有效,出去就失效;
2)但是local的變數可以繼續在這個block中呼叫的子程式中存在;
3)如果有與外界同名的變數,兩者在block退出後都不影響外界同名變數;
外部->內部:
如果在乙個block中有乙個my修飾的變數和外界的乙個變數同名,而且又需要在這個block中使用外界變數時,兩個辦法:第乙個辦法,用main的package修飾這個變數名,$main::global。第二個辦法,用our修飾,our $global,那麼該block中接下來出現的所有$global都是外界的global
示例**:
1#!/usr/bin/perl
2$x = 9;3
submm
6sub
gg_my
13sub
gg_local
18gg_my;
19gg_local;
20print
$x;
執行結果:
1 call-my112our-global 939
4 call-local205
2069
建立指標和訪問指標位址
賦值 建立引用
訪問位址
使用箭頭運算子訪問位址
$sca = 5
$p=\$sca
print $$p
@arr=(4,5,6)
$p=\@arr
print @$p
$p->[0]
print $$p[0]
%hash=(key=>'value')
$p=\%hash
print %$p
$p->
print $$p
指標引數
當乙個子例程接收引數時,便會把引數儲存到@_陣列中。當把兩個陣列同時傳遞給乙個子例程時,這兩個陣列都將儲存到@_陣列中,並連線成單個列表。如果不知道其中前乙個陣列長度的話,基本上就不可能再拆開這兩個陣列了。不過,如果傳遞給子例程的是兩個指標,分別含有這兩個陣列位址的話,就可以方便地實現陣列內容的分離。
示例**:
1#!/usr/bin/perl23
my@list1=(1..100);4
my@list2=(5,10,15,20);5
6print
"the total is :
" ,&addemup(\@list1,\@list2),"
.\n";7
8sub
addemup920
$total; #
相當於 return $total;
21 }
執行結果:
1 array(0x182a944)2 array(0x183728c
)3 the total is :5100.
檔案控制代碼的引用
示例**:
1#!/usr/bin/perl23
open( readme,"
d:\\perlwork1\\perl.pl
") || die;4
5 &readit(\*readme);#
reference to a typeglob67
subreadit
815 }
執行結果:
1$passwd is a glob(0x182a964).2#
!usr/bin/perl
3 。。。。
函式引數介紹
宣告 createpen style,width integer color colorref hpen style 引數可選值 ps solid 0 ps dash 1 ps dot 2 ps dashdot 3 ps dashdotdot 4 ps null 5 ps insideframe 6...
perl 函式的引數列表
在perl中,定義乙個函式的時候,不需要在圓括號內指定具體的引數,所有的引數都從 這個列表中得到 示例 sub test sub test 這樣寫當然沒有問題,但是有一點不足之處在於,缺少了圓括號內的形參列表,沒法直觀的一眼看出這個函式需要幾個引數 所以perl 中函式定義的時候支援下面這種寫法 s...
WinMain函式引數介紹
winmain函式的定義 winmain函式的原型宣告如下 int winapi winmain hinstance hinstance,當前視窗例項 hinstance hprevinstance,前乙個視窗例項 lpstr lpcmdline,命令列引數 int ncmdshow 視窗顯示狀態 ...