Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

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

by tobyink (Canon)
on Feb 25, 2013 at 16:04 UTC ( [id://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

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

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others browsing the Monastery: (7)
As of 2024-04-23 11:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found