大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> CGI专区 -> perl实例分析教程之十五

perl实例分析教程之十五

时间: 2021-07-31 作者:daque

perl中的“援用”一、援用简介 二、运用援用 三、运用反斜线()操纵符 四、援用和数组 五、多维数组 六、子步调的援用七、数组与子步调 八、文献句柄的援用 一、援用简介 援用即是南针,不妨指向变量、数组、哈希表(也叫关系数组)以至子步调。pascal或c步调员该当对援用(即南针)的观念很熟习,援用即是某值的地方,对其的运用则在于于步调员和谈话的规则。在perl中,不妨把援用称为南针,二者是通用的,无差其余。援用在创造搀杂数据上面格外有效。 perl第5中学的两种援用典型为硬援用和标记援用。标记援用含有变量的名字,它对运转时创造变量名并定位很有效,基础上,标记援用就象文献名或unix体例中的软链接。而硬援用则象文献体例中的硬链接。 perl4只承诺标记援用,给运用形成少许艰巨。比方,只承诺经过名字对包的标记名哈希表(名为_main{})创造索引。perl5则承诺数据的硬援用,简单多了。 硬援用盯梢援用的计数,当其数为零时,perl机动将被援用的名目开释,即使该名目是东西,则析构开释到外存池中。perl自己即是个面向东西的谈话,由于perl中的任何货色都是东西,包和模块使得东西更容易运用。 大略变量的硬援用很大略,对于非大略变量的援用,你必需显式地废除援用并报告其应怎样做,详见《perl中的面向东西编制程序》。 二、运用援用 本章中,大略变量指像$pointer如许的变量,$pointer仅含一个数据项,其不妨为数字、字符串或地方。 任何大略变量均可生存硬援用。由于数组和哈希表含有多个大略变量,以是不妨创造多种拉拢而成的搀杂的数据构造,如数组的数组、哈希表的数组、子步调的哈希表之类。只有你领会本来不过在用大略变量在处事,就该当不妨精确的在最搀杂的构造中精确地废除援用。 开始来看少许基础重心。 即使$pointer的值为一个数组的南针,则经过情势@$pointer来考察数组中的元素。情势@$pointer的意旨为“掏出$pointer中的地方值看成数组运用”。一致的,%$pointer为指向哈希表中第一个元素的援用。 有多种建立援用的本领,简直不妨对任何数据创造援用,如数组、大略变量、子步调、文献句柄,以及--c步调员会感爱好的--援用。perl使你有本领写出把本人都搞费解的极端搀杂的代码。:) 底下看看perl中创造和运用援用的本领。 三、运用反斜线()操纵符 反斜线操纵符与c谈话中传播地方的操纵符&功效一致。普遍是用创造变量又一个新的援用。底下为创造大略变量的援用的例子: $variavle = 22; $pointer = $variable; $ice = "jello"; $iceprt = $ice; 援用$pointer指向存有$variable值的场所,援用$iceptr指向"jello"。纵然首先的援用$variable废弃了,仍旧不妨经过$pointer考察该值,这是一个硬援用,以是必需同声废弃$pointer和$variable再不该空间开释到外存池中。 在上头的例子中,援用变量$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"; 截止输入如次: pointer address scalar(0x806c520) of 10 what pointer *(scalar(0x806c520)) points to 10 历次运转,输入截止中的地方会有所变换,但不妨看到$pointer给出地方,而$$pointer给出$variable的值。 看一下地方的表露,scalar反面一串十六进制,scalar证明该地方指向大略变量(即标量),反面的数字是本质存贮值的地方。 提防:南针即是地方,经过南针不妨考察该地方处存贮的数据。即使南针指向了失效的地方,就会获得不精确的数据。常常情景下,perl会归来null值,但不该依附于此,确定要在步调中把一切的南针精确地初始化,指向灵验的数据项。 四、援用和数组 对于perl谈话该当记取的最要害的一点大概是:perl中的数组和哈希表一直是一维的。所以,数组和哈希表只生存标量值,不径直存贮数组或其它的搀杂数据构造。数组的分子要么是数(或字符串)要么是援用。 对数组和哈希表不妨象对大略变量一律运用反斜线操纵符,数组的援用如次: 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 } 运转截止如次: $ 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指向数组@argv,第6行输入argv的地方。$pointer归来数组第一个元素的地方,这与c谈话中的数组南针是一致的。第7行挪用因变量scalar()赢得数组的元素个数,该参数亦可为@argv,但用南针则必需用@$pointer的情势指定其典型为数组,$pointer给出地方,@标记证明传播的地方为数组的第一个元素的地方。第10行与第7行一致,第11行用情势$$pointer[$i]列出一切元素。 对关系数组运用反斜线操纵符的本领是一律的--把一切关系数组名换成援用$poniter。提防数组和大略变量(标量)的援用表露时均带有典型--array和scalar,哈希表(关系数组)和因变量也一律,辨别为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 } 截止输入如次: $ 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 与数组一致,经过援用考察哈希表的元素情势为$$pointer{$index},固然,$index是哈希表的键值,而不只是数字。再有几种考察情势,其余,建立哈希表还不妨用=>操纵符,可读性更好些。底下再看一个例子: 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 截止输入如次: ================== start test ================= $$pointer{$i} is fri ${$pointer}{$i} is fri $pointer->{$i} is fri ${$pointer{$i}} is ${$pointer->{$i}} is ================== end of test ================= 不妨看到,前三种情势的输入表露了预期的截止,尔后两种则没有。当你不领会能否精确时,就输入截止看看。在perl中,有不精确的代码就用print语句输入来试验一下,这能使你领会perl是还好吗证明你的代码的。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.