Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re^2: Interpolation: when it occurs? another beginner question..

by karlgoethebier (Curate)
on Feb 25, 2013 at 15:26 UTC ( #1020533=note: print w/ replies, xml ) Need Help??


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

This is really cool! I think i'll put it on the wall in my office - to remember. Best regards, Karl

P.S.: I just bothered myself about this with eval and function interpolation :-(

«The Crux of the Biscuit is the Apostrophe»


Comment on Re^2: Interpolation: when it occurs? another beginner question..
Download Code
Re^3: Interpolation: when it occurs? another beginner question..
by tobyink (Abbot) on Feb 25, 2013 at 16:04 UTC

    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
      "...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..

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1020533]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (5)
As of 2014-09-03 05:26 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite cookbook is:










    Results (35 votes), past polls