Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

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

by tobyink (Abbot)
on Feb 25, 2013 at 16:04 UTC ( #1020538=note: print w/ replies, xml ) Need Help??


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


Comment on Re^3: Interpolation: when it occurs? another beginner question..
Select or Download Code
Replies are listed 'Best First'.
Re^4: Interpolation: when it occurs? another beginner question..
by karlgoethebier (Vicar) 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..

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (9)
As of 2015-07-30 00:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (269 votes), past polls