阿罗的技术博客

求知若渴,虚怀若愚。

Perl 学习笔记(12) -- 引用

引用

  • 引用就是指针,可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。Perl5中的两种引用类型为硬引用和符号引用。符号引用含有变量的名字,它对运行时创建变量名并定位很有用,基本上,符号引用就象文件名或UNIX系统中的软链接。而硬引用则象文件系统中的硬链接
  • 有多种构建引用的方法,几乎可以对任何数据建立引用,如数组、简单变量、子程序、文件句柄,以及C程序员会感兴趣的引用。Perl使你有能力写出把自己都搞糊涂的极其复杂的代码。:)
    • 使用反斜线(\)操作符, 反斜线操作符与C语言中传递地址的操作符&功能类似。一般是用\创建变量又一个新的引用。下面为创建简单变量的引用的例子:
      $variavle = 22;
      $pointer = \$variable;
      $ice = "jello";
      $iceprt = \$ice;
    • 引用$pointer指向存有$variable值的位置,引用$iceptr指向"jello"。即使最初的引用$variable销毁了,仍然可以通过$pointer访问该值,这是一个硬引用,所以必须同时销毁$pointer和$variable以便该空间释放到内存池中。到$pointer给出地址,而$$pointer给出$variavle的值
  • 引用和数组, 对数组和哈希表可以象对简单变量一样使用反斜线操作符.数组的引用如下:
    $pointer = \@ARGV;
    printf "\n Pointer Address of ARGV = $pointer\n";
    $i = scalar(@$pointer);
    printf "\n Number of arguments : $i \n";
    $i = 0;
    foreach (@$pointer) {
    printf "$i : $$pointer[$i++]; \n";}
    对于哈希的引用可以用%$pointer进行引用。哈希键值的引用$$pointer{$i},${$pointer}{$i} ,$pointer->{$i}\\
  • 多维数组或哈希,利用数组或哈希的值可以是引用的特点,可以创建多维数组或哈希,还可以是混合的哈希数组,数组哈希之类的数据结构。
  • 子程序的引用。子程序的返回值不仅限于数据,还可以返回子程序的引用。返回的子程序在调用处执行,但却是在最初被创建的调用处被设置
    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:$msg\n"; }; # 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
  • 数组与子程序。 数组利于管理相关数据,本节讨论如何向子程序传递多个数组。前面我们讲过用@_传递子程序的参数,但是@_是一个单维数组,不管你传递的参数是多少个数组,都按序存贮在@_中,故用形如my(@a,@b)=@_; 的语句来获取参数值时,全部值都赋给了@a,而@b为空。那么怎么把一个以上的数组传递给子程序呢?方法是用引用。将实参数组以应用的方式传给子函数。
  • 文件句柄的引用.有时,必须将同一信息输出到不同的文件,例如,某程序可能在一个实例中输出到屏幕,另一个输出到打印机,再一个输出到记录文件,甚至同时输出到这三个文件。相比较于每种处理写一个单独的语句,可以有更好的实现方式如下:
    spitOut(\*STDIN);
    spitOut(\*LPHANDLE);
    spitOut(\*LOGHANDLE);
    其中子程序spitOut的代码如下:
    sub spitOut {
    my $fh = shift;
    print $fh "Gee Wilbur, I like this lettuce\n";
    }

阅读更多
个人分类: Perl语言
上一篇Perl 学习笔记(11) -- 进程管理及其他
下一篇Perl 学习笔记(13) -- 面向对象的perl(包和模块)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭