use Contextual::Return; use Test::More 'no_plan'; my @todo_list = ( 'eat', 'drink', 'be merry' ); sub interp_explicit { return ( SCALAR { scalar @todo_list } # In scalar context: how many? LIST { @todo_list } # In list context: what are they? SCALARREF { \scalar @todo_list } # Scalar context value as ref ARRAYREF { \@todo_list } # List context value as array ref ); } sub interp_implicit { return ( SCALAR { scalar @todo_list } # In scalar context: how many? LIST { @todo_list } # In list context: what are they? ); } sub interp_num { return ( NUM { scalar @todo_list } # In num context: how many? LIST { @todo_list } # In list context: what are they? ); } sub interp_str { return ( NUM { @todo_list + 1 } # In num context: how many + 1? STR { scalar @todo_list } # In str context: how many? LIST { @todo_list } # In list context: what are they? ); } is "There are ${interp_explicit()} ToDo tasks: @{interp_explicit()}", 'There are 3 ToDo tasks: eat drink be merry' => 'Explicit interpolators'; is "There are ${interp_implicit()} ToDo tasks: @{interp_implicit()}", 'There are 3 ToDo tasks: eat drink be merry' => 'Implicit interpolators'; is "There are ${interp_num()} ToDo tasks: @{interp_num()}", 'There are 3 ToDo tasks: eat drink be merry' => 'Numeric interpolators'; is "There are ${interp_str()} ToDo tasks: @{interp_str()}", 'There are 3 ToDo tasks: eat drink be merry' => 'String interpolators'; is 0+${interp_str()}, "4" => 'Smart numbers'; is "".${interp_str()}, "3" => 'Smart strings';