符号引用

一般来说,类似$$var的结构表示,$var是一个引用变量,而且程序员希望该表达式能够返回$var所指向的值。
假如$var不是引用变量的话会出现什么情况呢?Perl并不是断然打印出错误信息,而是尝试检查$var的值是否为一字符串。如果是,Perl将以该字符串作为正规的变量名与这个变量重新加以组合!考虑下面的例子:
#!/usr/bin/perl
$x=10;
$var="x";
$$var=30;
print $x."\n";
print $$var."\n";
print "$$var\n";
${$var}=25;
print "${$var}"."\n";
当对$$var进行间接访问时,Perl首先检查$var是否是引用,在这里它不是,而是字符串。于是Perl会再给该表达式一次机会:它将$var的内容当作变量标识符($x)。这样一来,最终$x的值就被修改成30了。
应当注意重要的一点是符号引用只对全局变量有效,而不能应用于那些用my标识为私有的变量。
符号引用对数组和散列表同样适用:
$var = "x";
@$var = (1,2,3); #将@x的值设置为右边的枚举列表
注意$var前面的符号指示变量的存取类型:$$var等价于$x,@$var也等价于@x,这种特性非常有用。
对于那些在Perl的早期版本中就实现过此类功能的人来说,这要比使用eval更为高效。举例说明,你要在自己的脚本程序中,处理诸如“-Ddebug_level=3”的选项,并设置$debug_level变量。下面是其中的一种实现方式:
while($arg = shift @ARGV){
if($arg =~ /-D(\w+)=(\w+)/){
$var_name = $1; $value = $2;
$$var_name = $value; #更为简洁的可书写为:$$1 = $2;
}
}

从另一方面说,Perl竭尽全力使一个表达式正常工作,有时却于事无补。在前面的例子中,如果你所希望程序使用一个真正的引用,而不是字符串的话,那么你就会希望Perl能够指出这种情况而不是做任何的假定。幸运的的是,这种“急于求成”的方式可以被关闭。
Perl有许多编译时指令和指示。strict编译指示将告诉Perl做严格的错误检查。你甚至科以指定需要进行严格检查的范围,其中之一就包括“refs”这一项:
use strict 'refs';    #告诉Perl不允许符号引用
$var = "x";
$$var = 30;
无论何时你试图使用符号引用时均会导致运行时错误:
can't use string ("x") as a SCALAR ref while "strict refs" in use at try.pl line 3
strict指令直至程序块结束仍然有效。可以通过输入no strict 或更明确的no strict 'refs'将其关闭。
硬引用
1. 另一种数据类型的地址。硬引用本身是标量值。
$ptr=\任何其他类型:$,@,%,&,*(typeglob),$(another ptr)
引用本身是SCALAR保存的是指针值,引用的内容是$$ptr, %$ptr, @$ptr等等。
2. 创建对变量的引用(指针)时没有必要命名,如果变量或者子程序没有名称则成为匿名变量或匿名子程序。中缀运算符->用于分离匿名数字和匿名散列的引用(非必须,但是增加程序可读性)。
匿名数字元素包含在放括号[]中,方括号表达式不同与下标表达式,用于给标量赋值的情况。注意“”中[]为字面量。例如
my $arrayref = ['luffy', 'nami', 'robin'];
print $arrayref->[1].”\n”;
print $$arrayref[1].”\n”;
print ${$arrayref}[1].”\n”; #这三种形式相同
print “@{$arrayref}\n” #整个数组
#匿名哈希通过{}判断,同样这里与散列下标的花括号不同,它用于将散列赋值给标量引用。
my $hashref = {Captain=”luffy”, Helmsman=”nami”, Historian=”robin”}
print “$hashref->{Captain}\n”;
print keys %$hashref, “\n”;
对于各类嵌套数据结构的使用(等同于匿名数组/哈希)同样可以使用$array->[3]->[3],${$array->[3]}[3], 或者$array->[3][3]; 而@{$array->[3]}表示整个嵌套数字,%{$array->[2]}表示真个嵌套哈希。内嵌套哈希的哈希可以用$hashref->{Captain}->{Luffy}或者直接$$hashref{Captain}{Luffy}。
#!/usr/bin/perl
my $hashref={Captain=>"luffy", Helmsman=>"nami", Historian=>"robin"};
my $arrayref = [1, 2, $hashref]; #注意这里不能是%$hashref .
#print print $arrayref->[2]; #类型是HASH(地址);
print $arrayref->[2]->{Captain};
3. 匿名子程序
my $subref=sub{print @_;};
&$subref('a','b','c');
子程序传递引用:以往传递子程序时,都复制到@_数组中。如果变量太大会造成@_太大,需要放回的结果也太大。因此传递变量最有效和最简单的方式就是通过地址引用(依然通过@_传递地址,和C差不多)。
sub gifts{
my($n, $a) = @_; #将引用本地化
print “There are $$n gifts”;
print “@$t\n”;
push(@$t, 'abcd');
}
gifts(\$num, \@toys); #然后abcd被实际插入到了@toys中。
4. 文件句柄引用
open(LOG, “/etc/passwd”) || die “error while opening”;
&readit(\*LOG)
sub readit{
my($mylog)=@_;
while(<$mylog>) {
print;
}
close $mylog; #这里关闭,外面就不可以使用这个文件句柄了!
}
5. ref函数:用于测试引用存在,如果参数是引用则返回真。如果在printf “%s”还可以显示引用的类型。
$ptr = \@arr;
printf(“\$ptr is a reference to %s”, ref($ptr)) if ref($ptr);

转载于:https://blog.51cto.com/aboocool/627276

Learning Perl 8相关推荐

  1. Learning Perl学习笔记(1)第二章Scalar Data

    If Control Structure(IF循环) 脚本如下: #!/usr/bin/perl use warnings; use strict; use v5.24; my $line = < ...

  2. Learning Perl 2

    1.子程序 1).创建子程序:使用关键字sub sub marine { print "Hello, world\n"; } calling subroutines,使用& ...

  3. Learning Perl(Perl语言入门)学习笔记(3)

    第四章 子例程   1.  子例程(subroutine)即用户自定义函数,子例程调用时通常在子例程名前加上"&"符号:子例程名属于独立的命名空间: 2.  子例程可以在程 ...

  4. Learning Perl 4

    1. 控制结构 所有控制结构都可以做条件修饰符:command if (); unless(){} 等同于if(! ){} unless(){}else{} until(){} 等同于while(! ...

  5. Learning Perl chapter 4 练习题

    原文发表在网易博客 2010-11-06 13:07:36 第1题和第2题 #!perl -w #chapter 4 , exercise one and two use strict; sub to ...

  6. linux下perl命令行参数,Perl One-Liners | Perl命令行学习1 -e参数

    注:本内容需要点的perl编程基础,最好是读过<perl语言入门>. 本系列是自己平常学习工作中的总结,每一个实例均为我为了讲解而设置的,自己试过的,如有错误,望能见谅 Perl 命令行参 ...

  7. Perl/CGI脚本语言编程学习资料及开发工具下载大全

    Practical Extraction and Report Language Perl 最初的设计者为拉里·沃尔(Larry Wall),它于1987年12月18日发表.Perl借取了C.sed. ...

  8. Perl语言入门-第四章-子程序-习题

    1. 题目 2. 代码   1 #-----------------------------------------------------------#   2 # Source: Learning ...

  9. 还记得这门古老的编程语言么,送你一份perl书单!

    点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! ​ perl系列书单 ​ Perl语言编程 内容简介 从1991年问世以来,<Perl语言 ...

最新文章

  1. NHibernate初学体验记
  2. 病毒周报(100308至100314)
  3. iOS开发之功能模块--推送之坑问题解决
  4. ubuntu9.04换源
  5. oracle--rowid
  6. STM32 关于外部中断线、中断源和中断服务函数的问题
  7. python高级编程装饰器_Python装饰器
  8. 《Head First设计模式》第八章笔记-模板方法模式
  9. 软件工程 敏捷的酒后问答
  10. 如何快速排查生产问题
  11. 年底跳槽,都去哪儿?数万从业者的新选择即将揭幕
  12. 18650锂电池保护板接线图_锂电池保护板的原理介绍保护板的构成和主要作用
  13. 利用Axure制作动态表格(Axure学习日志1)
  14. 吴恩达机器学习教程中文笔记目录
  15. fgo服务器维护2018.123,FGO9月30日更新维护公告
  16. 如何计算前缀,网络,子网和主机号?
  17. 科研萌新成长记8——我不是不接受上帝,我只是不接受上帝创造的这个世界
  18. (八)苏世民:我的经验和教训:决策(567)
  19. 深度学习中分类和回归常见损失函数归纳小结
  20. ThinkPHP Lang多语言本地文件包含漏洞(QVD-2022-46174)漏洞复现

热门文章

  1. 关于异步请求的一些事
  2. 小强学渲染之OpenGL渲染管线详析
  3. git上传文件到github
  4. 020-Json结构数据序列化异步传递
  5. java迭代器应用 源码探究
  6. 上周热点回顾(6.20-6.26)
  7. LeetCode - Minimum Window Substring
  8. [原] 利用Radix树作为Key-Value 键值对的数据路由
  9. 安装Axis2的eclipse插件后,未出现界面
  10. ios html cookies,iOS-WKWebView携带cookie发送http请求,cookie失效