perl入门经典阅读笔记之四:第七章:子程序

明显感受到译者把这一章是分给两我的在翻译的,缘由以下:153页第一段:声明变量,英文原文是: state variable,一样是153页的倒数第三段,闭环,这个字英文版里面是Closure,明显是错误的!后续在166页,把一样的closure翻译成闭包。能够看出,这一章是两我的在作的翻译,并且第一我的的水平明显差不少。。编程

wantarray,判断子程序如何被调用,若是是标量上下文则返回0,列表上下文返回1.数组

Carp这个核心模块在Perl高效编程里面有描述。缓存

evalgotchas应该翻译成eval陷阱。。?感受应该是,这部分Perl高效编程都描述过。闭包

原型,这个在modern perl里面有描述,用于强制指定传入的参数类型:标量,列表仍是散列。scala

<!-- 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.code

(。。。。关于原型的占位。。。。)递归

递归,是调用自身的子程序,可是要避免死循环。好比说裴波那契数列:字符串

<!-- 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模块,生成缓存: <!-- lang: perl --> 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);

这样计算就能迅速不少。

相关文章
相关标签/搜索