初心者がperlを使いこなす!!

初心者がperlを使いこなす!!

ブログの説明を入力します。

Amebaでブログを始めよう!
アメーバやめます
理由は聞かないで下さい

冗談じゃないです
#!usr/bin/perl 

use 5.010;

use strict;

running_sum(1,2,3,4,5);

running_sum(1..10);

running_sum(10);

sub running_sum{

state $sum=0;

state @numbers;


foreach my $number(@_){

push @numbers,$number;

$sum+=$number;

}

say "the sum of(@numbers)is$sum";

}


結果はこうなる
sum of(1 2 3 4 5 6 7 8 9 10)is55
sum of(1 2 3 4 5 6 7 8 9 10 11)is66
sum of(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20)is210


以前まではサブルーチンの中でのプレイベートな変数、レキシカル変数にするために myを使ってたけど、今回のようなコードはmyは使えない

なぜならレキシカル変数はサブルーチンの呼び出してから次の呼び出しまで値を保持することができないから。

ためしにmyを使ってやってみることにする

#!usr/bin/perl 

use 5.010;

use strict;

sum(1..10);

sum(11);

sum(12..20);

sub sum{

my $sum=0;

my @aaa;

foreach my $bbb (@_){

push @aaa,$bbb;

$sum+=@aaa;

}

print"sum of(@aaa)is$sum\n";

}


結果は
sum of(1 2 3 4 5 6 7 8 9 10)is55
sum of(11)is1
sum of(12 13 14 15 16 17 18 19 20)is45


こうなってしまう。

一回目のサブルーチンの呼び出しで1から10までの合計を出したけど、2回目の呼び出しでは1回目の呼び出した値がすべて捨てられていて保持されていないから

11からスタートしている。

こうなるのを防いで、サブルーチンの次回の呼び出しまで値を保持するために
stateで変数を宣言する。

そうした場合、変数を次の呼び出しまで保持してくれるから、
前者のようになる。