解決できた

先に、昨日の作業のまとめを書いたところで、検索を継続して解決してしまった。
問題のメソッドの戻り値は次の形。
return @array;
Perlでは変数名の頭の@はそれが配列変数であることを示す。だから、配列がリターンしてくるから、その値を代入した変数は配列変数になると思い込んでいた。
しかし、ここでの肝は¥だったのだ。これがつくのとつかないのとでは大違いだったのだ。これが意味するところはリファレンス、CやC++でいう、参照やポインタに当たるものだったのだ。だから、戻り値をそのまま受けた変数を配列としてアクセスしても配列としての要素数はゼロにしかならない。
配列の参照を返した関数の受け方は、$で始まる通常変数で受け、さらにその頭に@をつけてアクセスする。つまり、
$val = func(return @array);
としておいて、
@$valが普通の配列変数としてアクセスできることになる。わかりにくい。個人のページや実行令はあるが、まとまったリファレンス系の見やすいページがJavaやPHPに比べて少ないので理解するのが大変だ、Perlは。本も高いし。
ちなみに、Mac::iTunesライブラリではHTML出力にテンプレートを使うが、テンプレートに配列を渡すときもリファレンスで渡す。だから、ローカルで宣言した配列をそのまま渡してもHTML出力に反応しないが、リファレンスを返す関数の戻り値をそのままテンプレートに渡せば表示される。
奥が深いぞ。仕事で使うことにでもならない限りは深入りする気はないのだが。

コメント