Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1793780
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: Python/Ruby

2012-03-26 09:52:57

Perl里也有指针:


  1. $a = 5;
  2. $p = \$a;
  3. print "$p\'s value is $$p\n"; # SCALAR(0x87418b4)'s value is 5

用反斜杠获取变量的地址,用$$来取值。上面的SCALAR说明指针指向的是简单变量。

下面看下数组的指针:


  1. @a = (1, 2, 3);
  2. $p = \@a;
  3. print "$p\'s value is @$p\n"; # ARRAY(0x876097c)'s value is 1 2 3
    #print "$$p\n"; # error: Not a SCALAR reference
    print $$p[1]."\n"; # 2
    print $p->[1]."\n"; # 2

可以看到ARRAY的字样。

再看看指针的指针:



  1.     $a = 5;
  2.     $p = \$a;
  3.     $pp = \$p;
  4.     print "$pp\'s value is $$pp\n"; # REF(0x90f78f0)'s value is SCALAR(0x90f78b4)
  5.     print "$$$pp\n"; # 5;
  6.     print "${$$pp}\n"; # 5 与$$$pp等价
  7.     print "${${$pp}}\n"; # 5 与$$$pp等价


可以看到REF的字样。

哈希表的指针:


  1. %hash = ("a", 5, "b", 10, "c", 15);
  2. $p = \%hash;
  3. print "$p\n"; # HASH(0x8607c38)
  4. print $$p{"a"}."\n"; # 5
  5. print $p->{"b"}."\n"; # 10
  6. print ${$p}{"c"}."\n"; # 15
  7. print $p{"a"}."\n"; # null 试着从p中取出key为"a"的值
  8. print ${$p{"a"}}."\n"; # null 等价于${null}
  9. print ${$p->{"a"}}."\n"; # null 等价于${5}

可以看到HASH的字样。

多维数组:


  1. $array = [2, [8, 'a'], ["red", 9, [21, "in"]]];
  2. print "$array\' value is @$array\n"; # ARRAY(0x8529f24)' value is 2 ARRAY(0x8521184) ARRAY(0x8521c38)
  3. print $array[0]."\n"; #null
  4. print $$array[0]."\n"; #2
  5. print $array->[0]."\n"; #2


它的类型也是ARRAY。

子程序的引用:


  1. $p = sub { print "sub\n" };
  2. print "$p\n"; # CODE(0x8a550d8)
  3. &$p; # sub
  4. &$p(); # sub
  5. #$p(); # error
  6. $p; # nothing

  7. sub fun1 { print "one\n"; }
  8. sub fun2 { $a = shift; print "$a\n"; }
  9. $p = \&fun1;
  10. &$p; # one
  11. $p = \&fun2;
  12. &$p("OK"); # OK

引用的类型为CODE。

在传递一个数组参数给一个子程序的时候,数组会展开成为参数列表中的各个项。可以用引用的方式来传递一个数组参数:


  1. sub supportArray {
  2.     $pArray = shift; # 第一个参数
  3.     print $pArray[1]."\n";
  4.     $a = shift; # 第二个参数
  5.     print "$a\n";
  6. }

  7. sub notSupportArray {
  8.     print @_[0]."\n"; # 第一个参数
  9.     print @_[1]."\n"; # 第二个参数
  10. }

  11. @array = (1, 2, 3);
  12. notSupportArray(@array, "x"); # 1, 2
  13. &supportArray(\@array, "x"); # 1, x


最后是文件句柄的引用:
  1. open(MYFILE, ">tmp") or die "file not opened\n";
  2. $pFile = \*MYFILE;
  3. print $pFile."\n"; # GLOB(0x8aaa8a8)
  4. print $pFile "This is my file!\n";
  5. close($pFile);

引用的类型是GLOB。

Perl5中的两种引用类型为硬引用和符号引用(软引用)。符号引用含有变量的名字,它对运行时创建变量名并定位很有用。硬引用跟踪引用的计数,当其数为零时,Perl自动将被引用的项目释放,如果该项目是对象,则析构释放到内存池中。下面是个例子:


  1. $var = "good";
  2. $hard = \$var; # 硬引用
  3. $symbolic = "var"; # 软引用
  4. print $hard."\n"; # good
  5. print $symbolic."\n"; # good

阅读(1049) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~