リファレンス(参照)
共分散を求める関数を作成するページでは
と説明しました。そこで以下のような策を弄したわけですが,これではコードを書くのにも手間がかかるし,第一に引数に指定したベクトルの長さが異なる場合には役に立ちません。
#これ以降の部分が重要 for($i=0;$i<$h;$i++){ $x[$i]=shift(@_); } for($k=0;$k<$h;$k++){ $y[$k]=shift(@_); } #ここまで
このように引数に複数のベクトルを指定する場合にはリファレンス(日本語では参照と呼ぶ)というものを使います。C言語をやったことのある人はポインタと同じだと考えて問題ないでしょうが,もしもポインタでつまずいたという人はここで理解しちゃってください。
-プログラム例 1 スカラー変数の場合
$x=244; print $x; print "\n"; print \$x;
-出力結果
C:\Perl>sample.pl 244 SCALAR(0x275e58)
さて,上の2例を見て「何でスカラー変数の前に\(円マーク)を付けた場合は変なものが表示されるのだろう」と疑問を抱いた人はGoodです。それ以外の人はあらかじめ仕組みを分かっている人か,あるいは疑問すら持てなかった人なのでどちらにせよこれ以降の説明を聞く必要はありません。
プログラム例1を見てください。最初にxという名前の変数に244というデータが代入されていますから,xの中身を表示させれば当然ながら244という数値が表示されます。ところが変数の前に\を付けた場合は変数の中身ではなく変数のある場所が表示されるのです。では変数のある場所とは何のことでしょうか。
正確にいえばコンピュータのメモリという所に1時的にデータが保存されているのですが,その辺のことを説明し出すと余計にワケが分からなくなってしまうのでやめときましょう。要するに変数xに代入された244というデータはコンピュータの何処かに1時的に保存されていると考えてください。だから今回の場合は"0x275e58"という場所に保存されているということです。この保存されている場所のことを特にアドレスなどといいます。
-プログラム例 2 ベクトルの場合
@dat=(1,2,3,4,5); $a=\@dat; print $a; print "\n"; print @$a; print "\n"; print $$a[0];
-出力結果
C:\Perl>sample.pl ARRAY(0x275e64) 12345 1
今度はプログラム例2を見てください。このプログラムの意味が分かればリファレンスを理解したといってもいいでしょう。1行ずつ何を意味しているかを考えてみてください。あっ,ちなみに書体によっては\(円マーク)が\(バックスラッシュ)になりますがこれはどちらも同じ意味です(英語圏内ではバックスラッシュが使われます)。
* | |の部分をドラッグすれば答えが見えます。
$a=\@dat;
これの意味は、、、 |@datのアドレスを変数aに代入|
print @$a;
これの意味は、、、 |$aには@datのアドレスが入っています。アドレスの入っている変数の前に@をつけると@datの中身が表示されます。|
print $$a[0];
これの意味は、、、 |0番目の要素を表示させます。もし1とすれば1番目の要素が表示されます。|
結局のところリファレンスを用いればベクトルをスカラー変数として扱えるので次のような応用が利くわけです。
-プログラム例 3
@x=(2,3,1,2,2,4); @y=(4,5,5,3); function(\@x,\@y); #@xと@yのアドレスを引数に指定 sub function{ my ($a,$b)=@_; print @$a;print "\n"; print @$b;print "\n"; }
-出力結果
C:\Perl>sample.pl 231224 4553
-プログラムの解説
function関数の引数には@xと@yのアドレスが指定されてるので,function関数はこの2つのアドレスを受け取り@_に格納します。このとき,
ということです。実際に
のようにすれば確認できます。つまりmy ($a,$b)=@_;の部分では
しているということになります。
次頁では今回学んだリファレンスの技術を応用して共分散と相関係数の関数を書き直してみましょう。