perl案例區(qū)分圖文說(shuō)明教程之15
發(fā)表時(shí)間:2024-02-05 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Perl中的“引用”一、引用簡(jiǎn)介 二、使用引用 三、使用反斜線(xiàn)()操作符 四、引用和數(shù)組 五、多維數(shù)組 六、子程序的引用七、數(shù)組與子程序 八、文件句柄的引用 一、引用簡(jiǎn)介 引用就是指針,可以指向變量、數(shù)組、哈希表(也叫關(guān)聯(lián)數(shù)組)甚至子程序。Pascal或C程序員應(yīng)該對(duì)引用(即指針)的概念很熟悉,引...
Perl中的“引用”
一、引用簡(jiǎn)介
二、使用引用
三、使用反斜線(xiàn)()操作符
四、引用和數(shù)組
五、多維數(shù)組
六、子程序的引用
七、數(shù)組與子程序
八、文件句柄的引用
一、引用簡(jiǎn)介
引用就是指針,可以指向變量、數(shù)組、哈希表(也叫關(guān)聯(lián)數(shù)組)甚至子程序。Pascal或C程序員應(yīng)該對(duì)引用(即指針)的概念很熟悉,引用就是某值的地址,對(duì)其的使用則取決于程序員和語(yǔ)言的規(guī)定。在Perl中,可以把引用稱(chēng)為指針,二者是通用的,無(wú)差別的。引用在創(chuàng)建復(fù)雜數(shù)據(jù)方面十分有用。
Perl5中的兩種引用類(lèi)型為硬引用和符號(hào)引用。符號(hào)引用含有變量的名字,它對(duì)運(yùn)行時(shí)創(chuàng)建變量名并定位很有用,基本上,符號(hào)引用就象文件名或UNIX系統(tǒng)中的軟鏈接。而硬引用則象文件系統(tǒng)中的硬鏈接。
Perl4只允許符號(hào)引用,給使用造成一些困難。例如,只允許通過(guò)名字對(duì)包的符號(hào)名哈希表(名為_(kāi)main{})建立索引。Perl5則允許數(shù)據(jù)的硬引用,方便多了。
硬引用跟蹤引用的計(jì)數(shù),當(dāng)其數(shù)為零時(shí),Perl自動(dòng)將被引用的項(xiàng)目釋放,如果該項(xiàng)目是對(duì)象,則析構(gòu)釋放到內(nèi)存池中。Perl本身就是個(gè)面向?qū)ο蟮恼Z(yǔ)言,因?yàn)镻erl中的任何東西都是對(duì)象,包和模塊使得對(duì)象更易于使用。
簡(jiǎn)單變量的硬引用很簡(jiǎn)單,對(duì)于非簡(jiǎn)單變量的引用,你必須顯式地解除引用并告訴其應(yīng)如何做,詳見(jiàn)《Perl中的面向?qū)ο缶幊獭贰?
二、使用引用
本章中,簡(jiǎn)單變量指像$pointer這樣的變量,$pointer僅含一個(gè)數(shù)據(jù)項(xiàng),其可以為數(shù)字、字符串或地址。
任何簡(jiǎn)單變量均可保存硬引用。因?yàn)閿?shù)組和哈希表含有多個(gè)簡(jiǎn)單變量,所以可以建立多種組合而成的復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如數(shù)組的數(shù)組、哈希表的數(shù)組、子程序的哈希表等等。只要你理解其實(shí)只是在用簡(jiǎn)單變量在工作,就應(yīng)該可以正確的在最復(fù)雜的結(jié)構(gòu)中正確地解除引用。
首先來(lái)看一些基本要點(diǎn)。
如果$pointer的值為一個(gè)數(shù)組的指針,則通過(guò)形式@$pointer來(lái)訪(fǎng)問(wèn)數(shù)組中的元素。形式@$pointer的意義為“取出$pointer中的地址值當(dāng)作數(shù)組使用”。類(lèi)似的,%$pointer為指向哈希表中第一個(gè)元素的引用。
有多種構(gòu)建引用的方法,幾乎可以對(duì)任何數(shù)據(jù)建立引用,如數(shù)組、簡(jiǎn)單變量、子程序、文件句柄,以及--C程序員會(huì)感興趣的--引用。Perl使你有能力寫(xiě)出把自己都搞糊涂的極其復(fù)雜的代碼。:)
下面看看Perl中創(chuàng)建和使用引用的方法。
三、使用反斜線(xiàn)()操作符
反斜線(xiàn)操作符與C語(yǔ)言中傳遞地址的操作符&功能類(lèi)似。一般是用創(chuàng)建變量又一個(gè)新的引用。下面為創(chuàng)建簡(jiǎn)單變量的引用的例子:
$variavle = 22;
$pointer = $variable;
$ice = "jello";
$iceprt = $ice;
引用$pointer指向存有$variable值的位置,引用$iceptr指向"jello"。即使最初的引用$variable銷(xiāo)毀了,仍然可以通過(guò)$pointer訪(fǎng)問(wèn)該值,這是一個(gè)硬引用,所以必須同時(shí)銷(xiāo)毀$pointer和$variable以便該空間釋放到內(nèi)存池中。
在上面的例子中,引用變量$pointer存的是$variable的地址,而不是值本身,要獲得值,形式為兩個(gè)$符號(hào),如下:
#!/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é)果中的地址會(huì)有所改變,但可以看到$pointer給出地址,而$$pointer給出$variable的值。
看一下地址的顯示,SCALAR后面一串十六進(jìn)制,SCALAR說(shuō)明該地址指向簡(jiǎn)單變量(即標(biāo)量),后面的數(shù)字是實(shí)際存貯值的地址。
注意:指針就是地址,通過(guò)指針可以訪(fǎng)問(wèn)該地址處存貯的數(shù)據(jù)。如果指針指向了無(wú)效的地址,就會(huì)得到不正確的數(shù)據(jù)。通常情況下,Perl會(huì)返回NULL值,但不該依賴(lài)于此,一定要在程序中把所有的指針正確地初始化,指向有效的數(shù)據(jù)項(xiàng)。
四、引用和數(shù)組
關(guān)于Perl語(yǔ)言應(yīng)該記住的最重要的一點(diǎn)可能是:Perl中的數(shù)組和哈希表始終是一維的。因此,數(shù)組和哈希表只保存標(biāo)量值,不直接存貯數(shù)組或其它的復(fù)雜數(shù)據(jù)結(jié)構(gòu)。數(shù)組的成員要么是數(shù)(或字符串)要么是引用。
對(duì)數(shù)組和哈希表可以象對(duì)簡(jiǎn)單變量一樣使用反斜線(xiàn)操作符,數(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ù)組第一個(gè)元素的地址,這與C語(yǔ)言中的數(shù)組指針是類(lèi)似的。第7行調(diào)用函數(shù)scalar()獲得數(shù)組的元素個(gè)數(shù),該參數(shù)亦可為@ARGV,但用指針則必須用@$pointer的形式指定其類(lèi)型為數(shù)組,$pointer給出地址,@符號(hào)說(shuō)明傳遞的地址為數(shù)組的第一個(gè)元素的地址。第10行與第7行類(lèi)似,第11行用形式$$pointer[$i]列出所有元素。
對(duì)關(guān)聯(lián)數(shù)組使用反斜線(xiàn)操作符的方法是一樣的--把所有關(guān)聯(lián)數(shù)組名換成引用$poniter。注意數(shù)組和簡(jiǎn)單變量(標(biāo)量)的引用顯示時(shí)均帶有類(lèi)型--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ù)組類(lèi)似,通過(guò)引用訪(fǎng)問(wèn)哈希表的元素形式為$$pointer{$index},當(dāng)然,$index是哈希表的鍵值,而不僅是數(shù)字。還有幾種訪(fǎng)問(wèn)形式,此外,構(gòu)建哈希表還可以用=>操作符,可讀性更好些。下面再看一個(gè)例子:
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é)果,而后兩種則沒(méi)有。當(dāng)你不清楚是否正確時(shí),就輸出結(jié)果看看。在Perl中,有不明確的代碼就用print語(yǔ)句輸出來(lái)實(shí)驗(yàn)一下,這能使你清楚Perl是怎樣解釋你的代碼的。