大雀软件园

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

perl实例分析教程之十六

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

perl中的“援用”五、多维数组 语句@array = list;不妨创造数组的援用,中括号不妨创造隐姓埋名数组的援用。底下语句为用来绘图的三维数组的例子: $line = ['solid' , 'black' , ['1','2','3'] , ['4','5','6']]; 此语句创造了一个含四个元素的三维数组,变量$line指向该数组。前两个元素是标量,存贮线条的典型和脸色,后两个元素是隐姓埋名数组的援用,存贮线条的开始和尽头。考察其元素语法如次: $arrayreference->[$index] single-dimensional array $arrayreference->[$index1][$index2] two-dimensional array $arrayreference->[$index1][$index2][$index3] three-dimensional array 不妨创造在你的才华、安排体味和计划机的外存承诺的情景下极尽搀杂的构造,但最佳对大概读到或处置你的代码的人和睦少许--尽管使代码大略些。另一上面,即使你想向旁人夸口你的编制程序本领,perl给你充满的时机和本领编写连本人都不免费解的代码。:) 倡导:当你想运用多于三维的数组时,最佳商量运用其它数据构造来简化代码。 底下为创造和运用二维数组的例子: 1 #!/usr/bin/perl 2 # 3 # using multi-dimensional array references 4 # 5 $line = ['solid', 'black', ['1','2','3'] , ['4', '5', '6']]; 6 print "$line->[0] = $line->[0] n"; 7 print "$line->[1] = $line->[1] n"; 8 print "$line->[2][0] = $line->[2][0] n"; 9 print "$line->[2][1] = $line->[2][1] n"; 10 print "$line->[2][2] = $line->[2][2] n"; 11 print "$line->[3][0] = $line->[3][0] n"; 12 print "$line->[3][1] = $line->[3][1] n"; 13 print "$line->[3][2] = $line->[3][2] n"; 14 print "n"; # the obligatory output beautifier. 截止输入如次: $line->[0] = solid $line->[1] = black $line->[2][0] = 1 $line->[2][1] = 2 $line->[2][2] = 3 $line->[3][0] = 4 $line->[3][1] = 5 $line->[3][2] = 6 那么三维数组又怎样呢?底下是上例略为变换的本子。 1 #!/usr/bin/perl 2 # 3 # using multi-dimensional array references again 4 # 5 $line = ['solid', 'black', ['1','2','3', ['4', '5', '6']]]; 6 print "$line->[0] = $line->[0] n"; 7 print "$line->[1] = $line->[1] n"; 8 print "$line->[2][0] = $line->[2][0] n"; 9 print "$line->[2][1] = $line->[2][1] n"; 10 print "$line->[2][2] = $line->[2][2] n"; 11 print "$line->[2][3][0] = $line->[2][3][0] n"; 12 print "$line->[2][3][1] = $line->[2][3][1] n"; 13 print "$line->[2][3][2] = $line->[2][3][2] n"; 14 print "n"; 截止输入如次: $line->[0] = solid $line->[1] = black $line->[2][0] = 1 $line->[2][1] = 2 $line->[2][2] = 3 $line->[2][3][0] = 4 $line->[2][3][1] = 5 $line->[2][3][2] = 6 考察第三层元素的办法形如$line->[2][3][0],一致于c谈话中的array_pointer[2][3][0]。本例中,下标均为数字,固然亦可用变量包办。用这种本领不妨把数组和哈希表贯串起来形成搀杂的构造,如次: 1 #!/usr/bin/perl 2 # 3 # using multi-dimensional array and hash references 4 # 5 %cube = ( 6 '0', ['0', '0', '0'], 7 '1', ['0', '0', '1'], 8 '2', ['0', '1', '0'], 9 '3', ['0', '1', '1'], 10 '4', ['1', '0', '0'], 11 '5', ['1', '0', '1'], 12 '6', ['1', '1', '0'], 13 '7', ['1', '1', '1'] 14 ); 15 $pointer = %cube; 16 print "n da cube n"; 17 foreach $i (sort keys %$pointer) { 18 $list = $$pointer{$i}; 19 $x = $list->[0]; 20 $y = $list->[1]; 21 $z = $list->[2]; 22 printf " point $i = $x,$y,$z n"; 23 } 截止输入如次: da cube point 0 = 0,0,0 point 1 = 0,0,1 point 2 = 0,1,0 point 3 = 0,1,1 point 4 = 1,0,0 point 5 = 1,0,1 point 6 = 1,1,0 point 7 = 1,1,1 这是一个设置正方体的例子。%cube中生存的是点号和坐标,坐标是个含三个数字的数组。变量$list获得坐标数组的援用:$list = $$ pointer{$i}; 而后考察各坐标值:$x = $list->[0]; ... 也可用如次本领给$x、$y和$z赋值:($x,$y,$z) = @$list; 运用哈希表和数组时,用$和用->是一致的,对数组而言底下两个语句等效: $$names[0] = "kamran"; $names->[0] = "kamran"; 对哈希表而言底下两个语句等效: $$lastnames{"kamran"} = "husain"; $lastnames->{"kamran"} = "husain"; perl中的数组不妨在运转中创造和扩充。当数组的援用第一次在等式左边出当前,该数组机动被创造,大略变量和多维数组也是一律。如次句,即使数组contours不生存,则被创造: $contours[$x][$y][$z] = &xlate($mousex, $mousey); 六、子步调的援用 perl中子步调的援用与c中因变量的南针一致,结构本领如次: $pointer_to_sub = sub {... declaration of sub ...}; 经过所结构的援用挪用子步调的本领为: &$pointer_to_sub(parameters); 子步调沙盘 子步调的归来值不只限于数据,还不妨归来子步调的援用。归来的子步调在调用途实行,但却是在首先被创造的调用途被树立,这是由perl对closure处置的办法确定的。closure意即即使你设置了一个因变量,它就以首先设置的实质运转。(closure详见oop的参考书)底下的例子中,树立了多个缺点消息表露子步调,如许的子步调设置本领可用来创造沙盘。 #!/usr/bin/perl sub errormsg { my $lvl = shift; # # define the subroutine to run when called. # return sub { my $msg = shift; # define the error type now. print "err level $lvl:$msgn"; }; # print later. } $severe = errormsg("severe"); $fatal = errormsg("fatal"); $annoy = errormsg("annoying"); &$severe("divide by zero"); &$fatal("did you forget to use a semi-colon?"); &$annoy("uninitialized variable in use"); 截止输入如次: err level severe:divide by zero err level fatal:did you forget to use a semi-colon? err level annoying:uninitialized variable in use 上例中,子步调errormsg运用结果域变量$lvl,用来归来给挪用者。当errormsg被挪用时,$lvl的值树立到归来的子步调实质中,固然是用的my因变量。三次挪用树立了三个各别的$lvl变量值。当errormsg归来时,$lvl的值生存到历次被证明时所爆发的子步调代码中。结果三句对爆发的子步调援用举行挪用时$msg的值被替代,但$lvl的值仍是相映子步调代码创造时的值。 很污染是吗?是的,以是如许的代码在perl步调中很罕见。 七、数组与子步调 数组利于处置关系数据,本节计划怎样向子步调传播多个数组。前方咱们讲过用@_传播子步调的参数,然而@_是一个单维数组,尽管你传播的参数是几何个数组,都按序存贮在@_中,故用形如my(@a,@b)=@_; 的语句来获得参数值时,十足值都赋给了@a,而@b为空。那么如何把一个之上的数组传播给子步调呢?本领是用援用。见下例: #!/usr/bin/perl @names = (mickey, goofy, daffy ); @phones = (5551234, 5554321, 666 ); $i = 0; sub listem { my ($a,$b) = @_; foreach (@$a) { print "a[$i] = " . @$a[$i] . " " . "tb[$i] = " . @$b[$i] ."n"; $i++; } } &listem(@names, @phones); 截止输入如次: a[0] = mickey b[0] = 5551234 a[1] = goofy b[1] = 5554321 a[2] = daffy b[2] = 666 提防: 1、当想传播给子步调的参数是多于一个的数组时确定要运用援用。 2、确定不要在子步调中运用形如 (@variable)=@_; 的语句处置参数,只有你想把一切参数会合到一个长的数组中。 八、文献句柄的援用 偶尔,必需将同一消息输入到各别的文献,比方,某步调大概在一个范例中输入到屏幕,另一个输入到打字与印刷机,再一个输入到记载文献,以至同声输入到这三个文献。比拟较于每种处置写一个独立的语句,不妨有更好的实行办法如次: spitout(*stdin); spitout(*lphandle); spitout(*loghandle); 个中子步调spitout的代码如次: sub spitout { my $fh = shift; print $fh "gee wilbur, i like this lettucen"; } 提防个中文献句柄援用的语法为*filehandle。

热门阅览

最新排行

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