2011-01-01
■ メソッド呼び出しのwantarrayはどうなるのか 
package Called; sub called { my ($class, $arg) = @_; printf "$arg: wantarray = %d defined = %d\n", wantarray, wantarray; return $class; } package main; sub func { $arg = shift; } Called->called("void called()"); () = Called->called("() = called()"); Called->called("void ->called->")->called("void ->called->called"); () = Called->called("() = ->called->")->called("() = ->called->called"); func( Called->called("func( called() )") );
出力結果
当たり前だがvoidコンテキストでwantarrayは偽(undef)になる。メソッドのチェーン(->called->called)はスカラーコンテキスト、関数呼び出しではリストコンテキストになる。
void called(): wantarray = 0 defined = 0 () = called(): wantarray = 1 defined = 1 void ->called->: wantarray = 0 defined = 1 void ->called->called: wantarray = 0 defined = 0 () = ->called->: wantarray = 0 defined = 1 () = ->called->called: wantarray = 1 defined = 1 func( called() ): wantarray = 1 defined = 1
コメント