use v5.10; use strict; use warnings; sub delayed (&) { package delayed; use overload q[""] => sub { $_[0]->() }, fallback => 1; bless shift; } my ($person, $thing); my $string = delayed {"Look $person, no $thing!"}; $person = "Ma"; $thing = "stringy eval"; say $string; #### use v5.10; use strict; use warnings; use PerlX::QuoteOperator delayed => { -emulate => 'q', -with => sub ($) { package delayed; my $str = shift; use PadWalker; use overload q[""] => sub { $_[0]->() }, fallback => 1; my $get = sub { my $var = shift; my $my = PadWalker::peek_my(3); return $my->{$var} if exists $my->{$var}; my $our = PadWalker::peek_our(3); return $our->{$var} if exists $our->{$var}; die "No such variable: $var\n"; }; bless sub { my $_ = $str; s/(\$\w+)/${$get->($1)}/eg; s/(\@\w+)/join $", @{$get->($1)}/eg; return $_; }; }, }; my $string = delayed "Look $person, no @thing!"; my $person = "Ma"; my @thing = qw( stringy eval ); say $string;