第80回 ソースコードリーディングのコツ 関数突入編

さて、今回は、
関数に引数が渡るときの話を書きます。

変数を追うか追わないかそれが問題だ

use strict;

my $c = 1;

hoge($c);

こういうソースを見たとき、
$cの値がかわってたら大変だなぁ と思って
hoge関数の中を読む事はまずない。

なぜかというと、
関数へは値のコピーしか渡らない「値渡し」だからである。



それに対して、
つぎのようになっていると「参照渡し(Perl的にはリファレンス渡し)」なので、
$cの内容がhoge関数の中で書き換えられる可能性があるのでhoge関数の中を読まなければならないだろう。

use strict;

my $c = 1;

hoge(\$c);


ただ、値渡しの場合でも、hoge関数の中のロジックを理解しておかないと
それ以降の部分を読むに苦労しそうならばhoge関数の中まで目を通しておかないといけないだろう。


目も当てられない状況

関数にハッシュのリファレンスが渡っているときは、
泣きそうになりながらそのソースを読むか、平穏に読み切れるかは、そのソースを書いた人の手腕による。

use strict;

my $c = {};

hoge($c);

このように、ハッシュへのリファレンスが渡った場合、これは「参照渡し」である。
さらに、ハッシュへはいつでもキーと値を追加可能なのである。

hoge関数の処理を抜けると、

{
  'n' => 1,
  'm' => 3,
  'z' => 20,

  以下略


};

こんな感じでキーが20個も30個も作られていたら泣いてしまいそうになる。
しかもデータ構造として脈略があればまだ少しは納得がいくのだが、データ構造としてなんの脈力もなかった日にはもう...


さらに、if文の分岐で、キーが増える可能性がある処理と、増えない可能性がある処理だった日にはもう...