关闭

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

标签: perlsubroutine数据结构unix语言c
369人阅读 评论(0) 收藏 举报
分类:

引用

  • 引用就是指针,可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。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";
    }

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:62910次
    • 积分:910
    • 等级:
    • 排名:千里之外
    • 原创:34篇
    • 转载:2篇
    • 译文:0篇
    • 评论:3条
    文章存档