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。

  • 相关阅读:
    python set 使用
    python判断字符串是字母 数字 大小写
    go语言中的运算符^,&
    golang 之 flag.String
    关于Mac或Linux下GO的Permission denied提示错误
    《算法竞赛进阶指南》0x05排序 POJ3784 对顶堆动态维护中位数
    大顶堆的基本操作(线性表建堆+siftup+siftdown+insert+delete)
    《算法竞赛进阶指南》0x05排序 环形均分纸牌问题
    SublimeText3配置c/c++环境
    《算法竞赛进阶指南》0x05 排序 离散化
  • 原文地址:https://www.cnblogs.com/yiyi-xuechen/p/4422053.html
Copyright © 2011-2022 走看看