假如需要知道调用时的上下文环境,我们可以用wantarray操作符,如果子程序调用时处于列表上下文,它会返回真。
sub sorted_text_files { if(wantarray){ sort @files; #列表上下文返回列表 }else { join ' ',sort @files ; #标量上下文时,返回字符串 } }
1.空上下文
空上下文,wantarray 会跳过后续代码,直接返回undef
sub sorted_text_files { return unless defined wantarray ; #实际代码此处省略 }
2.精确控制
想要知道从子程序返回的数据在运行中究竟发生了什么,可以用Contextual::Return 模块探查。
摘录部分代码:
use Contextual::Return; use Carp; sub foo { return SCALAR { 'thirty-twelve' } LIST { 1,2,3 } BOOL { 1 } NUM { 7*6 } STR { 'forty-two' } HASHREF { {name => 'foo', value => 99} } ARRAYREF { [3,2,1] } GLOBREF { \*STDOUT } CODEREF { croak "Don't use this result as code!"; } ; } # and later... if (my $foo = foo()) { for my $count (1..$foo) { print "$count: $foo is:\n" . " array: @{$foo}\n" . " hash: $foo->{name} => $foo->{value}\n" ; } print {$foo} $foo->(); }