perl入门经典阅读笔记之四:第七章:子程序
明显感觉到译者把这一章是分给两个人在翻译的,原因如下:153页第一段:声明变量,英文原文是: state variable,同样是153页的倒数第三段,闭环,这个字英文版里面是Closure,明显是错误的!后续在166页,把同样的closure翻译成闭包。可以看出,这一章是两个人在做的翻译,而且第一个人的水平明显差很多。。 wantarray,判断子程序如何被调用,如果是标量上下文则返回0,列表上下文返回1. Carp这个核心模块在Perl高效编程里面有描述。 evalgotchas应该翻译成eval陷阱。。?感觉应该是,这部分Perl高效编程都描述过。 原型,这个在modern perl里面有描述,用于强制指定传入的参数类型:标量,列表还是散列。 <!-- lang: perl --> sub mylength($) { my $arg = shift; return‘ARRAY’ eq ref $arg ? scalar @$arg: ‘HASH’ eq ref $arg ? scalar keys %$arg: length $arg; } my $scalar = “whee!”; print mylength($scalar),“n”; my @array = ( 1,18,9 ); print mylength(@array),“n”; my %hash = ( foo => ‘bar’ ); print mylength(%hash),“n”; 输出结果为 5 1 3,这是因为输入的内容被强制转换为标量上下文:第一个是标量字符串,其中有5个字符,所以输出为5;第二个是数组,表示强制转化为标量上下文时,所以返回的是数组的个数,而不是数组中元素的本身;第三个就比较奇怪了,因为直接输出scalar %hash,得到的结果是1/8,,然后再次对标量上下文求值,所以最终的结果是3. 现在可以用[]的语法封装三个基本数据类型,如[$@%],则得到的结果为所期望的5 3 1. (。。。。关于原型的占位。。。。) 递归,是调用自身的子程序,但是要避免死循环。比如说裴波那契数列: <!-- lang: perl --> sub F{ my $n = shift; return 0 if $n == 0; return 1 if $n == 1; return F($n-1) + F($n-2); } print F(7); 得到的结果是13。 另外,还可以使用Memoize模块,生成缓存: use Memoize; memoize('F'); sub F{ my $n = shift; return 0 if $n == 0; return 1 if $n == 1; return F($n-1) + F($n-2); } print F(50); 这样计算就能迅速很多。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |