変数の値を入れ替えるとき、どうするかというのは有名な方法がありますね。
my $t=$a;
$a=$b;
$b=$t;
一旦、値を待避させて代入すると。
ちょっとめんどくさいですね。
Cでこんなマクロを作って、SWAP(int,a,b);とすれば入れ替えできるようにしてる人がいるとか。
#define SWAP(T,a,b) do{ T t; t=a; a=b; b=t; }while(0)
まぁこんなの使う意味があるのかはよくわからないけど、
確かに値を待避させるためだけの変数を用意するのはめんどくさいよな。
なんてことを以前考えていたのですが、Perlでこんなことすることないことに気付いた。
Perlでは複数の変数にまとめて代入することができます。
my ($x,$y)=(1,2);
いくつかの変数をまとめて代入するならこの書き方の方がスマートですね。
これは右辺で配列を作って左辺が配列としてうけるというようなもののようです。
複数の数で配列を作ったり、複数の変数に配列を代入したりというのと一緒です。
ならできるかなと思って、こういうのをやってみた。
($a,$b)=($b,$a);
これでちゃんと入れ替えられてます。
これなら待避させるためだけの変数のことを気にすることはないし、スマートだし。
というわけで最近は専らこの方法を使ってます。
RubyでもPythonでも同じように行けますね。
a,b = b,a #Ruby・Python共通
Perlに比べると括弧が不要な分使いやすいかな。
フィボナッチ数列という数列があるのだが、
これは第二項まで1,1で、それ以降は前2つの項を足したものが延々と続くと。
第50項まで表示するPerlのプログラムを書いてみようと思う。
use strict;
use warnings;
my ($a,$b)=(1,1);
print "1 $a\n"; #第1項
my $n=2;
while($n<=50){
print "$n $b\n";
$n++;
($a,$b)=($b,$a+$b);
}
第$n項を$b,第($n-1)項目を$aに入れておく。
それで$nを進めるたびに、$bの値を$aに動かし、新しい$bに$a+$bを入れる。
これも変数の入れ替え同様に待避させる変数が必要なはずだけど、
特に気にすることなく進めることができます。
あまり考えないで書いてしまうと、前の代入で変わってしまった値を使って次の代入をするから変な数字になる。
気付いて待避させるようにするべきだけど、しないと変な結果になるはず。
複数の変数にまとめて代入するというのは、座標を取り扱うときとか、
そういうときには積極的に使うけど、そうでもなければあまり使わない。
むしろバラバラに書いた方がこれにこの値という対応が見えてわかりやすいときもある。
けどこういう特徴があるんだよというのは知っておくと便利なこともありますね。
同時に代入したい、と思うときはまとめて代入するといいよと覚えておこう。