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);

這樣計算就能迅速不少。

相關文章
相關標籤/搜索