Hatena::Groupperl

Perl Tech RSSフィード

2011-01-01

メソッド呼び出しのwantarrayはどうなるのか はてなブックマーク -  メソッド呼び出しのwantarrayはどうなるのか - Perl Tech

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