Perl函式及引數介紹

2022-07-03 18:00:14 字數 4471 閱讀 3225

子例程,函式

子例程,函式的作用域是指在程式中能夠看到它的位置範圍。子例程是全域性的,可以放在指令碼中的任意位置,甚至放在其他指令碼檔案中。當使用來自其他檔案的子例程時,應當使用關鍵字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

print

"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

print

"black in main\n";

19print

"the new values are @n \n

";

執行結果:

1 the values in the @_array are 123

452 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-my112

our-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 視窗顯示狀態 ...