明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

perl案例區(qū)分圖文說明教程之15

[摘要]Perl中的“引用”一、引用簡介 二、使用引用 三、使用反斜線()操作符 四、引用和數(shù)組 五、多維數(shù)組 六、子程序的引用七、數(shù)組與子程序 八、文件句柄的引用 一、引用簡介 引用就是指針,可以指向變量、數(shù)組、哈希表(也叫關(guān)聯(lián)數(shù)組)甚至子程序。Pascal或C程序員應(yīng)該對引用(即指針)的概念很熟悉,引...
Perl中的“引用”

一、引用簡介
二、使用引用
三、使用反斜線()操作符
四、引用和數(shù)組
五、多維數(shù)組
六、子程序的引用
七、數(shù)組與子程序
八、文件句柄的引用

一、引用簡介

引用就是指針,可以指向變量、數(shù)組、哈希表(也叫關(guān)聯(lián)數(shù)組)甚至子程序。Pascal或C程序員應(yīng)該對引用(即指針)的概念很熟悉,引用就是某值的地址,對其的使用則取決于程序員和語言的規(guī)定。在Perl中,可以把引用稱為指針,二者是通用的,無差別的。引用在創(chuàng)建復(fù)雜數(shù)據(jù)方面十分有用。
Perl5中的兩種引用類型為硬引用和符號引用。符號引用含有變量的名字,它對運(yùn)行時創(chuàng)建變量名并定位很有用,基本上,符號引用就象文件名或UNIX系統(tǒng)中的軟鏈接。而硬引用則象文件系統(tǒng)中的硬鏈接。
Perl4只允許符號引用,給使用造成一些困難。例如,只允許通過名字對包的符號名哈希表(名為_main{})建立索引。Perl5則允許數(shù)據(jù)的硬引用,方便多了。
硬引用跟蹤引用的計(jì)數(shù),當(dāng)其數(shù)為零時,Perl自動將被引用的項(xiàng)目釋放,如果該項(xiàng)目是對象,則析構(gòu)釋放到內(nèi)存池中。Perl本身就是個面向?qū)ο蟮恼Z言,因?yàn)镻erl中的任何東西都是對象,包和模塊使得對象更易于使用。
簡單變量的硬引用很簡單,對于非簡單變量的引用,你必須顯式地解除引用并告訴其應(yīng)如何做,詳見《Perl中的面向?qū)ο缶幊獭贰?

二、使用引用

本章中,簡單變量指像$pointer這樣的變量,$pointer僅含一個數(shù)據(jù)項(xiàng),其可以為數(shù)字、字符串或地址。
任何簡單變量均可保存硬引用。因?yàn)閿?shù)組和哈希表含有多個簡單變量,所以可以建立多種組合而成的復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如數(shù)組的數(shù)組、哈希表的數(shù)組、子程序的哈希表等等。只要你理解其實(shí)只是在用簡單變量在工作,就應(yīng)該可以正確的在最復(fù)雜的結(jié)構(gòu)中正確地解除引用。
首先來看一些基本要點(diǎn)。
如果$pointer的值為一個數(shù)組的指針,則通過形式@$pointer來訪問數(shù)組中的元素。形式@$pointer的意義為“取出$pointer中的地址值當(dāng)作數(shù)組使用”。類似的,%$pointer為指向哈希表中第一個元素的引用。
有多種構(gòu)建引用的方法,幾乎可以對任何數(shù)據(jù)建立引用,如數(shù)組、簡單變量、子程序、文件句柄,以及--C程序員會感興趣的--引用。Perl使你有能力寫出把自己都搞糊涂的極其復(fù)雜的代碼。:)
下面看看Perl中創(chuàng)建和使用引用的方法。

三、使用反斜線()操作符

反斜線操作符與C語言中傳遞地址的操作符&功能類似。一般是用創(chuàng)建變量又一個新的引用。下面為創(chuàng)建簡單變量的引用的例子:
$variavle = 22;
$pointer = $variable;
$ice = "jello";
$iceprt = $ice;
引用$pointer指向存有$variable值的位置,引用$iceptr指向"jello"。即使最初的引用$variable銷毀了,仍然可以通過$pointer訪問該值,這是一個硬引用,所以必須同時銷毀$pointer和$variable以便該空間釋放到內(nèi)存池中。
在上面的例子中,引用變量$pointer存的是$variable的地址,而不是值本身,要獲得值,形式為兩個$符號,如下:

#!/usr/bin/perl
$value = 10;
$pointer = $value;
printf "n Pointer Address $pointer of $value n";
printf "n What Pointer *($pointer) points to $$pointern";

結(jié)果輸出如下:

Pointer Address SCALAR(0x806c520) of 10
What Pointer *(SCALAR(0x806c520)) points to 10

每次運(yùn)行,輸出結(jié)果中的地址會有所改變,但可以看到$pointer給出地址,而$$pointer給出$variable的值。
看一下地址的顯示,SCALAR后面一串十六進(jìn)制,SCALAR說明該地址指向簡單變量(即標(biāo)量),后面的數(shù)字是實(shí)際存貯值的地址。
注意:指針就是地址,通過指針可以訪問該地址處存貯的數(shù)據(jù)。如果指針指向了無效的地址,就會得到不正確的數(shù)據(jù)。通常情況下,Perl會返回NULL值,但不該依賴于此,一定要在程序中把所有的指針正確地初始化,指向有效的數(shù)據(jù)項(xiàng)。

四、引用和數(shù)組

關(guān)于Perl語言應(yīng)該記住的最重要的一點(diǎn)可能是:Perl中的數(shù)組和哈希表始終是一維的。因此,數(shù)組和哈希表只保存標(biāo)量值,不直接存貯數(shù)組或其它的復(fù)雜數(shù)據(jù)結(jié)構(gòu)。數(shù)組的成員要么是數(shù)(或字符串)要么是引用。
對數(shù)組和哈希表可以象對簡單變量一樣使用反斜線操作符,數(shù)組的引用如下:


1 #!/usr/bin/perl
2 #
3 # Using Array references
4 #
5 $pointer = @ARGV;
6 printf "n Pointer Address of ARGV = $pointern";
7 $i = scalar(@$pointer);
8 printf "n Number of arguments : $i n";
9 $i = 0;
10 foreach (@$pointer) {
11 printf "$i : $$pointer[$i++]; n";
12 }

運(yùn)行結(jié)果如下:

$ test 1 2 3 4
Pointer Address of ARGV = ARRAY(0x806c378)
Number of arguments : 4
0 : 1;
1 : 2;
2 : 3;
3 : 4;

第5行將引用$pointer指向數(shù)組@ARGV,第6行輸出ARGV的地址。$pointer返回?cái)?shù)組第一個元素的地址,這與C語言中的數(shù)組指針是類似的。第7行調(diào)用函數(shù)scalar()獲得數(shù)組的元素個數(shù),該參數(shù)亦可為@ARGV,但用指針則必須用@$pointer的形式指定其類型為數(shù)組,$pointer給出地址,@符號說明傳遞的地址為數(shù)組的第一個元素的地址。第10行與第7行類似,第11行用形式$$pointer[$i]列出所有元素。
對關(guān)聯(lián)數(shù)組使用反斜線操作符的方法是一樣的--把所有關(guān)聯(lián)數(shù)組名換成引用$poniter。注意數(shù)組和簡單變量(標(biāo)量)的引用顯示時均帶有類型--ARRAY和SCALAR,哈希表(關(guān)聯(lián)數(shù)組)和函數(shù)也一樣,分別為HASH和CODE。下面是哈希表的引用的例子。

#!/usr/bin/perl
1 #
2 # Using Associative Array references
3 #
4 %month = (
5 '01', 'Jan',
6 '02', 'Feb',
7 '03', 'Mar',
8 '04', 'Apr',
9 '05', 'May',
10 '06', 'Jun',
11 '07', 'Jul',
12 '08', 'Aug',
13 '09', 'Sep',
14 '10', 'Oct',
15 '11', 'Nov',
16 '12', 'Dec',
17 );
18
19 $pointer = %month;
20
21 printf "n Address of hash = $pointern ";
22
23 #
24 # The following lines would be used to print out the
25 # contents of the associative array if %month was used.
26 #
27 # foreach $i (sort keys %month) {
28 # printf "n $i $$pointer{$i} ";
29 # }
30
31 #
32 # The reference to the associative array via $pointer
33 #
34 foreach $i (sort keys %$pointer) {
35 printf "$i is $$pointer{$i} n";
36 }

結(jié)果輸出如下:

$ mth
Address of hash = HASH(0x806c52c)
01 is Jan
02 is Feb
03 is Mar
04 is Apr
05 is May
06 is Jun
07 is Jul
08 is Aug
09 is Sep
10 is Oct
11 is Nov
12 is Dec

與數(shù)組類似,通過引用訪問哈希表的元素形式為$$pointer{$index},當(dāng)然,$index是哈希表的鍵值,而不僅是數(shù)字。還有幾種訪問形式,此外,構(gòu)建哈希表還可以用=>操作符,可讀性更好些。下面再看一個例子:

1 #!/usr/bin/perl
2 #
3 # Using Array references
4 #
5 %weekday = (
6 '01' => 'Mon',
7 '02' => 'Tue',
8 '03' => 'Wed',
9 '04' => 'Thu',
10 '05' => 'Fri',
11 '06' => 'Sat',
12 '07' => 'Sun',
13 );
14 $pointer = %weekday;
15 $i = '05';
16 printf "n ================== start test ================= n";
17 #
18 # These next two lines should show an output
19 #
20 printf '$$pointer{$i} is ';
21 printf "$$pointer{$i} n";
22 printf '${$pointer}{$i} is ';
23 printf "${$pointer}{$i} n";
24 printf '$pointer->{$i} is ';
25
26 printf "$pointer->{$i}n";
27 #
28 # These next two lines should not show anything 29 #
30 printf '${$pointer{$i}} is ';
31 printf "${$pointer{$i}} n";
32 printf '${$pointer->{$i}} is ';
33 printf "${$pointer->{$i}}";
34 printf "n ================== end of test ================= n";
35

結(jié)果輸出如下:

================== start test =================
$$pointer{$i} is Fri
${$pointer}{$i} is Fri
$pointer->{$i} is Fri
${$pointer{$i}} is
${$pointer->{$i}} is
================== end of test =================

可以看到,前三種形式的輸出顯示了預(yù)期的結(jié)果,而后兩種則沒有。當(dāng)你不清楚是否正確時,就輸出結(jié)果看看。在Perl中,有不明確的代碼就用print語句輸出來實(shí)驗(yàn)一下,這能使你清楚Perl是怎樣解釋你的代碼的。