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 "\n Pointer Address of ARGV = $pointer\n";
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;

  第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] . " " . "\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

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

八、文件句柄的引用

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

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

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

posted @ 2015-04-13 14:09  yiyi_xuechen  Views(598)  Comments(0Edit  收藏  举报