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

原创 2012年03月22日 23:40:28

引用

  • 引用就是指针,可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。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学习笔记1-基础摘要

1.@ARGV 保存程序的参数,不包括程序名,各参数可通过$ARGV[index]访问;程序名称保存在$0中。 2.子过程参数保存在@_中,各个参数通过$_[index]访问。 3.List @A...
  • ydl85
  • ydl85
  • 2012年08月07日 17:54
  • 111

PostgreSQL学习笔记12 -end

PostgreSQL学习笔记(十二) 数据库维护 一、恢复磁盘空间   在PostgreSQL中,使用delete和update语句删除或更新的数据行并没有被实际删除,而只是在...

live555学习笔记12-h264 rtp包的时间戳

十二 h264 rtp包的时间戳 这次我们一起来分析一下live555中是怎样为rtp包打时间戳的.就以h264为例吧. [cpp] view plaincopyprint? ...

Perl学习笔记(7) --控制结构和目标操作

控制结构 前面已经提到的控制结构有if {} ,if {} else {}, while(){} , foreach 还有些其他的控制结构,比如 unless() {} 是if的反义词,在boo...
  • freesum
  • freesum
  • 2012年03月20日 23:55
  • 942

linux学习笔记-web综合项目

  • 2015年11月29日 17:45
  • 1010KB
  • 下载

CCIE路由学习笔记-3-EIGRP

  • 2015年03月29日 13:57
  • 1.56MB
  • 下载

unity3D-游戏/AR/VR在线就业班 C#入门值类型和引用类型学习笔记

unity3D-游戏/AR/VR在线就业班 C#入门值类型和引用类型学习笔记

CCIE路由学习笔记-2

  • 2015年03月29日 13:52
  • 1.09MB
  • 下载

CCIE路由学习笔记-4-OSPF

  • 2015年03月29日 14:01
  • 55KB
  • 下载

Perl 语言笔记(1)-标量类型

标量类型 字符串的两种形式 单引号‘: 除了\'代表‘, \\代表\外引号内的所有内容代表他自己。双引号“: 可以嵌入控制字符,嵌入十进制,八进制,16进制的数字,嵌入转义符号, 字符串...
  • freesum
  • freesum
  • 2012年03月10日 16:20
  • 589
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Perl 学习笔记(12) -- 引用
举报原因:
原因补充:

(最多只允许输入30个字)