高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

プロトタイプのわな

 Perlのサブルーチン宣言には、以下のようなプロトタイプ宣言が出来ます。

sub method($$%){
};

 これはサブルーチンの引数の型(スカラー変数だとか、リストだとか)を縛るもので、宣言しておけば、引数に指定されてないタイプの引数が渡されたり、数が多すぎるときに警告が出てスクリプトが停止します。
 ただし、サブルーチンを、名前で直接呼び出した場合のみ。しかも&を抜かしたときのみです。

&method($scalar1, @array1, %hash1); # 警告されない
method($scalar1, @array1, %hash1); # 警告される

Perlの言語設計者としては、&抜け宣言を推奨したいのかもしれないですねぇ…。


 とはいえ、これもこれで問題があります。プロトタイプでハッシュリストを要求していることを示す(ハズだと思っていた)"%"ですが、これを指定したところにハッシュリストを渡しても、引数はハッシュリストとして受け取れません。どうやら、リストコンテキストになってしまっているようです*1。つまり、プロトタイプ宣言を使うと、ハッシュリストを引数で渡すことが出来なくなってしまうようです。
 これまた混乱の元になるのが、プロトタイプ宣言の意味がなくなったとき(&をつけてサブルーチンを呼び出したときorオブジェクトのメソッドとしてサブルーチンを呼び出したとき)にはハッシュリストを引数で渡せるのです。これに悩んで困った困った。混乱を防ぐためにも、ハッシュリストは常にリファレンスで渡すようにしたほうが良いかもしれません。

*1:うちにあるISBN:4774107557:titleで確認してみると、以降の引数にリストコンテキストを強制するとありました。これはリストコンテキストを示す@と同じようです