Perl里也有指针:
- $a = 5;
- $p = \$a;
- print "$p\'s value is $$p\n"; # SCALAR(0x87418b4)'s value is 5
用反斜杠获取变量的地址,用$$来取值。上面的SCALAR说明指针指向的是简单变量。
下面看下数组的指针:
- @a = (1, 2, 3);
- $p = \@a;
- 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的字样。
再看看指针的指针:
- $a = 5;
- $p = \$a;
- $pp = \$p;
- print "$pp\'s value is $$pp\n"; # REF(0x90f78f0)'s value is SCALAR(0x90f78b4)
- print "$$$pp\n"; # 5;
- print "${$$pp}\n"; # 5 与$$$pp等价
- print "${${$pp}}\n"; # 5 与$$$pp等价
可以看到REF的字样。
哈希表的指针:
- %hash = ("a", 5, "b", 10, "c", 15);
- $p = \%hash;
- print "$p\n"; # HASH(0x8607c38)
- print $$p{"a"}."\n"; # 5
- print $p->{"b"}."\n"; # 10
- print ${$p}{"c"}."\n"; # 15
- print $p{"a"}."\n"; # null 试着从p中取出key为"a"的值
- print ${$p{"a"}}."\n"; # null 等价于${null}
- print ${$p->{"a"}}."\n"; # null 等价于${5}
可以看到HASH的字样。
多维数组:
- $array = [2, [8, 'a'], ["red", 9, [21, "in"]]];
- print "$array\' value is @$array\n"; # ARRAY(0x8529f24)' value is 2 ARRAY(0x8521184) ARRAY(0x8521c38)
- print $array[0]."\n"; #null
- print $$array[0]."\n"; #2
- print $array->[0]."\n"; #2
它的类型也是ARRAY。
子程序的引用:
- $p = sub { print "sub\n" };
- print "$p\n"; # CODE(0x8a550d8)
- &$p; # sub
- &$p(); # sub
- #$p(); # error
- $p; # nothing
- sub fun1 { print "one\n"; }
- sub fun2 { $a = shift; print "$a\n"; }
- $p = \&fun1;
- &$p; # one
- $p = \&fun2;
- &$p("OK"); # OK
引用的类型为CODE。
在传递一个数组参数给一个子程序的时候,数组会展开成为参数列表中的各个项。可以用引用的方式来传递一个数组参数:
- sub supportArray {
- $pArray = shift; # 第一个参数
- print $pArray[1]."\n";
- $a = shift; # 第二个参数
- print "$a\n";
- }
- sub notSupportArray {
- print @_[0]."\n"; # 第一个参数
- print @_[1]."\n"; # 第二个参数
- }
- @array = (1, 2, 3);
- notSupportArray(@array, "x"); # 1, 2
- &supportArray(\@array, "x"); # 1, x
最后是文件句柄的引用:
- open(MYFILE, ">tmp") or die "file not opened\n";
- $pFile = \*MYFILE;
- print $pFile."\n"; # GLOB(0x8aaa8a8)
- print $pFile "This is my file!\n";
- close($pFile);
引用的类型是GLOB。
Perl5中的两种引用类型为硬引用和符号引用(软引用)。符号引用含有变量的名字,它对运行时创建变量名并定位很有用。硬引用跟踪引用的计数,当其数为零时,Perl自动将被引用的项目释放,如果该项目是对象,则析构释放到内存池中。下面是个例子:
- $var = "good";
- $hard = \$var; # 硬引用
- $symbolic = "var"; # 软引用
- print $hard."\n"; # good
- print $symbolic."\n"; # good
阅读(1057) | 评论(0) | 转发(0) |