有幾種方法可以做到這一點。我將展示其中的兩個:
首先,在Perl的現代版本,你可以使用state
:
use feature qw/state/;
print someRoutine(100,200), "\n";
print someRoutine(100,200), "\n";
sub someRoutine {
state $someAddition = 0;
foreach my $someSum (@_) {
$someAddition += $someSum;
}
return $someAddition;
}
在這個版本中,$someAddition
變量將進行一次初始化爲零,並且只有一次。從那時起,這些價值將在通話之間保留。
另一個版本是使用詞法閉包。這裏有一個例子:
my $summer = makeSummer();
print $summer->(100,200), "\n";
print $summer->(100,200), "\n";
sub makeSummer {
my $someAddition = 0;
return sub {
$someAddition += $_ foreach @_;
return $someAddition;
}
}
第二個版本稍微複雜一些,但有兩個優點。首先,您可以簡單地通過調用makeSummer
例程來製造一個新閉包來開始新的總結。其次,它可以在任何版本的Perl 5上運行,而不僅僅是最新版本的關鍵字state
。
如果你不與聲明的子之前初始化狀態變量而言,你也可以這樣做:
my $someAddition;
sub someRoutine {
$someAddition = 0 unless defined $someAddition;
foreach my $someSum(@_) {
$someAddition += $someSum;
}
return $someAddition;
}
第四種方法是利用包全局變量。我最後一次保存這篇文章是因爲它最容易出現濫用和錯誤。但你在這裏;
our $someAddition = 0;
someRoutine(100,200);
print "$someAddition\n";
someRoutine(100,200);
print "$someAddition\n";
sub someRoutine {
$someAddition += $_ foreach @_;
}
在這最後的版本,$someAddition
是一個包全局,其全球範圍使它可內外生活在同一個命名空間內的任何子程序之外。
謝謝你的回答。不幸的是,我們在學校使用的perl版本非常陳舊,所以狀態無法正常工作,而且我需要讓子程序返回一個包含數組中衆多項目的數組,因此我不知道詞法關閉是否是一個將工作。有沒有其他方法? – user2128074 2015-02-08 06:03:46
'return($ someAddition,[@array]);'Perl的返回值不一定是同類實體。 – DavidO 2015-02-08 06:05:09
對不起,如果我沒有正確解釋它,但$ someAddition是我返回的數組的一部分。 – user2128074 2015-02-08 06:07:28