⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 perl12.htm

📁 Perl作为一门重要的工程语言
💻 HTM
📖 第 1 页 / 共 2 页
字号:
              24 &nbsp; printf '$pointer->{$i} is ';<br>
              25<br>
              26 &nbsp; printf "$pointer->{$i}\n";<br>
              27 #<br>
              28 # These next two lines should not show anything 29 #<br>
              30 &nbsp; printf '${$pointer{$i}} is ';<br>
              31 &nbsp; printf "${$pointer{$i}} \n";<br>
              32 &nbsp; printf '${$pointer->{$i}} is ';<br>
              33 &nbsp; printf "${$pointer->{$i}}";<br>
              34 printf "\n ================== end of test ================= \n";<br>
              35</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;结果输出如下:<br>
            <blockquote>================== start test =================<br>
              $$pointer{$i} is Fri<br>
              ${$pointer}{$i} is Fri<br>
              $pointer->{$i} is Fri<br>
              ${$pointer{$i}} is<br>
              ${$pointer->{$i}} is<br>
              ================== end of test =================</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;可以看到,前三种形式的输出显示了预期的结果,而后两种则没有。当你不清楚是否正确时,就输出结果看看。在Perl中,有不明确的代码就用print语句输出来实验一下,这能使你清楚Perl是怎样解释你的代码的。<br>
            <a name=5>五、多维数组</a><br>
            &nbsp;&nbsp;&nbsp;&nbsp;语句@array = list;可以创建数组的引用,中括号可以创建匿名数组的引用。下面语句为用于画图的三维数组的例子:<br>
            &nbsp;&nbsp;&nbsp;&nbsp;$line = ['solid' , 'black' , ['1','2','3'] 
            , ['4','5','6']];<br>
            &nbsp;&nbsp;&nbsp;&nbsp;此语句建立了一个含四个元素的三维数组,变量$line指向该数组。前两个元素是标量,存贮线条的类型和颜色,后两个元素是匿名数组的引用,存贮线条的起点和终点。访问其元素语法如下:<br>
            <blockquote>$arrayReference->[$index] &nbsp; &nbsp; single-dimensional 
              array<br>
              $arrayReference->[$index1][$index2] &nbsp; two-dimensional array<br>
              $arrayReference->[$index1][$index2][$index3] three-dimensional array</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;可以创建在你的智力、设计经验和计算机的内存允许的情况下极尽复杂的结构,但最好对可能读到或管理你的代码的人友好一些--尽量使代码简单些。另一方面,如果你想向别人炫耀你的编程能力,Perl给你足够的机会和能力编写连自己都难免糊涂的代码。:)<br>
            &nbsp;&nbsp;&nbsp;&nbsp;建议:当你想使用多于三维的数组时,最好考虑使用其它数据结构来简化代码。<br>
            &nbsp;&nbsp;&nbsp;&nbsp;下面为创建和使用二维数组的例子:<br>
            <blockquote>1&nbsp; #!/usr/bin/perl<br>
              2&nbsp; #<br>
              3&nbsp; # Using Multi-dimensional Array references<br>
              4&nbsp; #<br>
              5&nbsp; $line = ['solid', 'black', ['1','2','3'] , ['4', '5', '6']];<br>
              6&nbsp; print "\$line->[0] = $line->[0] \n";<br>
              7&nbsp; print "\$line->[1] = $line->[1] \n";<br>
              8&nbsp; print "\$line->[2][0] = $line->[2][0] \n";<br>
              9&nbsp; print "\$line->[2][1] = $line->[2][1] \n";<br>
              10 print "\$line->[2][2] = $line->[2][2] \n";<br>
              11 print "\$line->[3][0] = $line->[3][0] \n";<br>
              12 print "\$line->[3][1] = $line->[3][1] \n";<br>
              13 print "\$line->[3][2] = $line->[3][2] \n";<br>
              14 print "\n"; # The obligatory output beautifier.</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;结果输出如下:<br>
            <blockquote>$line->[0] = solid<br>
              $line->[1] = black<br>
              $line->[2][0] = 1<br>
              $line->[2][1] = 2<br>
              $line->[2][2] = 3<br>
              $line->[3][0] = 4<br>
              $line->[3][1] = 5<br>
              $line->[3][2] = 6</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;那么三维数组又如何呢?下面是上例略为改动的版本。<br>
            <blockquote>1&nbsp; #!/usr/bin/perl<br>
              2&nbsp; #<br>
              3&nbsp; # Using Multi-dimensional Array references again<br>
              4&nbsp; #<br>
              5&nbsp; $line = ['solid', 'black', ['1','2','3', ['4', '5', '6']]];<br>
              6&nbsp; print "\$line->[0] = $line->[0] \n";<br>
              7&nbsp; print "\$line->[1] = $line->[1] \n";<br>
              8&nbsp; print "\$line->[2][0] = $line->[2][0] \n";<br>
              9&nbsp; print "\$line->[2][1] = $line->[2][1] \n";<br>
              10 print "\$line->[2][2] = $line->[2][2] \n";<br>
              11 print "\$line->[2][3][0] = $line->[2][3][0] \n";<br>
              12 print "\$line->[2][3][1] = $line->[2][3][1] \n";<br>
              13 print "\$line->[2][3][2] = $line->[2][3][2] \n";<br>
              14 print "\n";</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;结果输出如下:<br>
            <blockquote>$line->[0] = solid<br>
              $line->[1] = black<br>
              $line->[2][0] = 1<br>
              $line->[2][1] = 2<br>
              $line->[2][2] = 3<br>
              $line->[2][3][0] = 4<br>
              $line->[2][3][1] = 5<br>
              $line->[2][3][2] = 6</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;访问第三层元素的方式形如$line->[2][3][0],类似于C语言中的Array_pointer[2][3][0]。本例中,下标均为数字,当然亦可用变量代替。用这种方法可以把数组和哈希表结合起来构成复杂的结构,如下:<br>
            <blockquote>1 #!/usr/bin/perl<br>
              2 #<br>
              3 # Using Multi-dimensional Array and Hash references<br>
              4 #<br>
              5 %cube = (<br>
              6 '0', ['0', '0', '0'],<br>
              7 '1', ['0', '0', '1'],<br>
              8 '2', ['0', '1', '0'],<br>
              9 '3', ['0', '1', '1'],<br>
              10 '4', ['1', '0', '0'],<br>
              11 '5', ['1', '0', '1'],<br>
              12 '6', ['1', '1', '0'],<br>
              13 '7', ['1', '1', '1']<br>
              14 );<br>
              15 $pointer = \%cube;<br>
              16 print "\n Da Cube \n";<br>
              17 foreach $i (sort keys %$pointer) {<br>
              18 $list = $$pointer{$i};<br>
              19 $x = $list->[0];<br>
              20 $y = $list->[1];<br>
              21 $z = $list->[2];<br>
              22 printf " Point $i = $x,$y,$z \n";<br>
              23 }</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;结果输出如下:<br>
            <blockquote>Da Cube<br>
              Point 0 = 0,0,0<br>
              Point 1 = 0,0,1<br>
              Point 2 = 0,1,0<br>
              Point 3 = 0,1,1<br>
              Point 4 = 1,0,0<br>
              Point 5 = 1,0,1<br>
              Point 6 = 1,1,0<br>
              Point 7 = 1,1,1</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;这是一个定义立方体的例子。%cube中保存的是点号和坐标,坐标是个含三个数字的数组。变量$list获取坐标数组的引用:$list 
            = $$ pointer{$i}; 然后访问各坐标值:$x = $list->[0]; ... 也可用如下方法给$x、$y和$z赋值:($x,$y,$z) 
            = @$list;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;使用哈希表和数组时,用$和用->是类似的,对数组而言下面两个语句等效:<br>
            &nbsp;&nbsp;&nbsp;&nbsp;$$names[0] = "kamran";<br>
            &nbsp;&nbsp;&nbsp;&nbsp;$names->[0] = "kamran";<br>
            &nbsp;&nbsp;&nbsp;&nbsp;对哈希表而言下面两个语句等效:<br>
            &nbsp;&nbsp;&nbsp;&nbsp;$$lastnames{"kamran"} = "Husain";<br>
            &nbsp;&nbsp;&nbsp;&nbsp;$lastnames->{"kamran"} = "Husain";<br>
            &nbsp;&nbsp;&nbsp;&nbsp;Perl中的数组可以在运行中创建和扩展。当数组的引用第一次在等式左边出现时,该数组自动被创建,简单变量和多维数组也是一样。如下句,如果数组contours不存在,则被创建:<br>
            &nbsp;&nbsp;&nbsp;&nbsp;$contours[$x][$y][$z] = &xlate($mouseX, $mouseY);<br>
            <a name=6>六、子程序的引用</a><br>
            &nbsp;&nbsp;&nbsp;&nbsp;perl中子程序的引用与C中函数的指针类似,构造方法如下:<br>
            &nbsp;&nbsp;&nbsp;&nbsp;$pointer_to_sub = sub {... declaration of 
            sub ...};<br>
            &nbsp;&nbsp;&nbsp;&nbsp;通过所构造的引用调用子程序的方法为:<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&$pointer_to_sub(parameters);<br>
            <ul>
              <li><a name="6.1">子程序模板</a></li>
            </ul>
            <br>
            &nbsp;&nbsp;&nbsp;&nbsp;子程序的返回值不仅限于数据,还可以返回子程序的引用。返回的子程序在调用处执行,但却是在最初被创建的调用处被设置,这是由Perl对Closure处理的方式决定的。Closure意即如果你定义了一个函数,它就以最初定义的内容运行。(Closure详见OOP的参考书)下面的例子中,设置了多个错误信息显示子程序,这样的子程序定义方法可用于创建模板。<br>
            <blockquote>#!/usr/bin/perl<br>
              sub errorMsg {<br>
              &nbsp; my $lvl = shift;<br>
              &nbsp; #<br>
              &nbsp; # define the subroutine to run when called.<br>
              &nbsp; #<br>
              &nbsp; return sub {<br>
              &nbsp; &nbsp; my $msg = shift; # Define the error type now.<br>
              &nbsp; &nbsp; print "Err Level $lvl:$msg\n"; }; # print later.<br>
              &nbsp; }<br>
              $severe = errorMsg("Severe");<br>
              $fatal = errorMsg("Fatal");<br>
              $annoy = errorMsg("Annoying");<br>
              <br>
              &$severe("Divide by zero");<br>
              &$fatal("Did you forget to use a semi-colon?");<br>
              &$annoy("Uninitialized variable in use");</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;结果输出如下:<br>
            <blockquote>Err Level Severe:Divide by zero<br>
              Err Level Fatal:Did you forget to use a semi-colon?<br>
              Err Level Annoying:Uninitialized variable in use</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;上例中,子程序errorMsg使用了局域变量$lvl,用于返回给调用者。当errorMsg被调用时,$lvl的值设置到返回的子程序内容中,虽然是用的my函数。三次调用设置了三个不同的$lvl变量值。当errorMsg返回时,$lvl的值保存到每次被声明时所产生的子程序代码中。最后三句对产生的子程序引用进行调用时$msg的值被替换,但$lvl的值仍是相应子程序代码创建时的值。<br>
            &nbsp;&nbsp;&nbsp;&nbsp;很混淆是吗?是的,所以这样的代码在Perl程序中很少见。<br>
            <a name=7>七、数组与子程序</a><br>
            &nbsp;&nbsp;&nbsp;&nbsp;数组利于管理相关数据,本节讨论如何向子程序传递多个数组。前面我们讲过用@_传递子程序的参数,但是@_是一个单维数组,不管你传递的参数是多少个数组,都按序存贮在@_中,故用形如my(@a,@b)=@_; 
            的语句来获取参数值时,全部值都赋给了@a,而@b为空。那么怎么把一个以上的数组传递给子程序呢?方法是用引用。见下例:<br>
            <blockquote>#!/usr/bin/perl<br>
              @names = (mickey, goofy, daffy );<br>
              @phones = (5551234, 5554321, 666 );<br>
              $i = 0;<br>
              sub listem {<br>
              &nbsp; my ($a,$b) = @_;<br>
              &nbsp; foreach (@$a) {<br>
              &nbsp; &nbsp; print "a[$i] = " . @$a[$i] . " " . "\tb[$i] = " . 
              @$b[$i] ."\n";<br>
              &nbsp; &nbsp; $i++;<br>
              &nbsp; }<br>
              }<br>
              &listem(\@names, \@phones);</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;结果输出如下:<br>
            <blockquote>
              <pre>
a[0] = mickey     b[0] = 5551234
a[1] = goofy      b[1] = 5554321
a[2] = daffy      b[2] = 666</pre>
            </blockquote>
            注意:
            <blockquote>1、当想传递给子程序的参数是多于一个的数组时一定要使用引用。<br>
              2、一定不要在子程序中使用形如 (@variable)=@_; 的语句处理参数,除非你想把所有参数集中到一个长的数组中。</blockquote>
            <a name=8>八、文件句柄的引用</a><br>
            &nbsp;&nbsp;&nbsp;&nbsp;有时,必须将同一信息输出到不同的文件,例如,某程序可能在一个实例中输出到屏幕,另一个输出到打印机,再一个输出到记录文件,甚至同时输出到这三个文件。相比较于每种处理写一个单独的语句,可以有更好的实现方式如下:<br>
            &nbsp;&nbsp;&nbsp;&nbsp;spitOut(\*STDIN);<br>
            &nbsp;&nbsp;&nbsp;&nbsp;spitOut(\*LPHANDLE);<br>
            &nbsp;&nbsp;&nbsp;&nbsp;spitOut(\*LOGHANDLE);<br>
            &nbsp;&nbsp;&nbsp;&nbsp;其中子程序spitOut的代码如下:<br>
            <blockquote>sub spitOut {<br>
              &nbsp; my $fh = shift;<br>
              &nbsp; print $fh "Gee Wilbur, I like this lettuce\n";<br>
              }</blockquote>
                &nbsp;&nbsp;&nbsp;&nbsp;注意其中文件句柄引用的语法为\*FILEHANDLE。<br>
            <p align=center><a href=perl11.htm>上一章</a> <a href=perl13.htm>下一章</a> 
              <a href=index.htm>目录</a></p>
            <p align=center>&nbsp; </p>
            <!-- #EndEditable --></td>
        </tr>
      </table>
    </td></tr></table></body><!-- #EndTemplate --></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -