zoukankan      html  css  js  c++  java
  • Perl5中的引用和指针

    一、引用简介

      引用就是指针,可以指向变量、数组、哈希表甚至是子程序。

    二、使用引用

      如果$pointer的值为一个数组的指针,则通过形式@$pointer来访问数组中的元素。形式@$pointer的意义为“取出$pointer中的地址值当作数组使用”。类似的,%$pointer为指向哈希表中第一个元素的引用。

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

      反斜线操作符与C语言中传递地址的操作符&功能类似。一般是用创建变量又一个新的引用。下面为创建简单变量的引用的例子:
        $variavle = 22;
        $pointer = $variable;
        $ice = "jello";
        $iceprt = $ice;
        引用$pointer指向存有$variable值的位置,引用$iceptr指向"jello"。

    四、引用和数组

      关于Perl语言应该记住的最重要的一点可能是:Perl中的数组和哈希表始终是一维的。因此,数组和哈希表只保存标量值,不直接存贮数组或其它的复杂数据结构。数组的成员要么是数(或字符串)要么是引用。
        对数组和哈希表可以象对简单变量一样使用反斜线操作符,数组的引用如下:

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

        运行结果如下:
      $ test 1 2 3 4 
      Pointer Address of ARGV = ARRAY(0x806c378)
      Number of arguments : 4
      0 : 1;
      1 : 2;
      2 : 3;
      3 : 4;

      第11行用形式$$pointer[$i]列出所有元素

      通过引用访问哈希表的元素形式为$$pointer{$index}

    五、多维数组

    六、子程序引用

      perl中子程序的引用与C中函数的指针类似,构造方法如下:
         $pointer_to_sub = sub {... declaration of sub ...};
         通过所构造的引用调用子程序的方法为:
         &$pointer_to_sub(parameters);

    七、数组与子程序

      

    #!/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] . " " . " b[$i] = " . @$b[$i] ." ";
        $i++;
      }
    }
    &listem(@names, @phones);

        结果输出如下:

    a[0] = mickey     b[0] = 5551234
    a[1] = goofy      b[1] = 5554321
    a[2] = daffy      b[2] = 666

    PS
    1. 当想传递给子程序的参数是多于一个的数组时,一定要使用引用;
    2. 一定不要在子程序中使用形如(@variable) = @_;的语句处理参数,除非你想要把所有参数集中到一个长的数组中。

    八、文件句柄的引用

    有时,必须将同一信息输出到不同的文件,例如,某程序可能在一个实例中输出到屏幕,另一个输出到打印机,再一个输出到记录文件,甚至同时输出到这三个文件。相比较于每种处理写一个单独的语句,可以有更好的实现方式如下:
        spitOut(*STDIN);
        spitOut(*LPHANDLE);
        spitOut(*LOGHANDLE);
        其中子程序spitOut的代码如下:

    sub spitOut {
      my $fh = shift;
      print $fh "Gee Wilbur, I like this lettuce ";
    }

        注意其中文件句柄引用的语法为*FILEHANDLE。

  • 相关阅读:
    UVA 1386 Cellular Automaton
    ZOJ 3331 Process the Tasks
    CodeForces 650B Image Preview
    CodeForces 650A Watchmen
    CodeForces 651B Beautiful Paintings
    CodeForces 651A Joysticks
    HUST 1601 Shepherd
    HUST 1602 Substring
    HUST 1600 Lucky Numbers
    POJ 3991 Seinfeld
  • 原文地址:https://www.cnblogs.com/yiyi-xuechen/p/4422053.html
Copyright © 2011-2022 走看看