Perl小技集2
[HOME] [BACK] [NEXT]勢いで小技集2に突入。相変わらずまとまりありませんが。。
1.参照渡しによるサブルーチン呼び出し
小技集1で、参照はcのポインターと同等と書きましたが、そうすると当然cのポインター渡しによる関数呼び出しは、perlでは参照渡しによるサブルーチン呼び出しとなるわけです。その主な効能としては、cと同様サブルーチンの中で引数の値をいじると呼び出し元で渡した参照が指す実体変数の値も変更されるという事です。サブルーチンから複数の値を返したい場合の必須テクニックです。
$bb = 10; print "呼び出し前:$bb\n"; &test1($bb); print "実体渡し後:$bb\n"; &test2(\$bb); print "参照渡し後:$bb\n"; ## サブルーチン ## sub test1{ my($aa) = @_; $aa++; #引数をいじる } sub test2{ my($aa) = @_; $$aa++; #引数(参照)を逆参照して実体をいじる } --------------------------------- 呼び出し前:10 実体渡し後:10 参照渡し後:11
参照渡しにはもう一つPerl特有の効能が有ります。Perlでは引数に複数の配列やハッシュ、 またはスカラーと配列などを指定してサブルーチンに渡すと、サブルーチンではひとつのつながったリストとして受け取ってしまいます。通常、これら引数を分離してサブルーチンで受け取るためには配列やハッシュの参照を渡します。
@aa = (0,1,2); $bb = 10; @cc = ('a','b','c'); &test1(@aa,$bb,@cc); ## サブルーチン ## sub test1{ my(@w) = @_;##一つのリストにまとめられてしまう print "@w\n"; } --------------------------------- 01210abc
@aa = (0,1,2); $bb = 10; @cc = ('a','b','c'); &test1(\@aa,\$bb,\@cc);##全て参照で渡す ## サブルーチン ## sub test1{ my($aref,$bref,$cref) = @_;##別々に受け取れる print "@$aref\n$$bref\n@$cref\n"; } --------------------------------- 012 10 abc