in reply to Re^2: Interpolation: when it occurs? another beginner question..
in thread Interpolation: when it occurs? another beginner question..

For what it's worth, it does also work with lexical variables, but you need to declare them up-front...

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;

Here's a version that eliminates the need to declare variables up-front, but does the interpolation manually using s///eg. It's pretty dodgy, and I wouldn't put it anywhere near production code, but it's quite cute as an example...

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;

It's cute, but the code that does the interpolation is pretty dodgy.

package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name

Replies are listed 'Best First'.
Re^4: Interpolation: when it occurs? another beginner question..
by karlgoethebier (Abbot) on Feb 25, 2013 at 18:48 UTC
    "...but you need to declare them up-front...eliminates the need to declare variables up-front...pretty dodgy"

    You've got that crystal ball, yes ;-) or how else did you know about my next question?

    Best regards, Karl

    «The Crux of the Biscuit is the Apostrophe»


      tobyink++ very modern or postmodern, if you prefere.

      there are no rules, there are no thumbs..