明顯感受到譯者把這一章是分給兩我的在翻譯的,緣由以下: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);
這樣計算就能迅速不少。