再帰を使用すると、各呼び出しで渡される引数はすべて、呼び出しフレーム/スタックに配置されます。Carp&cluckを使用すると、コールフレームを確認できます。中間結果は、スタックがベースケース($ v == 1)に到達したときに巻き戻される間に計算されます。CPUレジスタのみにあるのでしょうか?そして、演算子(*)は、この中間結果にスタック上の$vを乗算します。この記事もチェックしてください。
#!/usr/bin/env perl
use strict;
use IO::Handle;
use Carp qw(cluck);
STDOUT->autoflush(1);
STDERR->autoflush(1);
sub factorial {
my $v = shift;
dummy_func();
return 1 if $v == 1;
print "Variable v value: $v and it's address:", \$v, "\ncurrent sub factorial addr:", \&factorial, "\n","-"x40;
return $v * factorial($v - 1);
}
sub dummy_func {
cluck;
}
factorial(5);
また、デバッグモードで実行すると役立ちます。
perl -d factorial.pl