NAME
String::Interpolate::Delayed - delay string interpolation until you really want it
SYNOPSIS
use strict;
use warnings;
use String::Interpolate::Delayed;
my $str = delayed "$role of the $thing";
my $role = "Lord";
my $thing = [qw( Rings Flies Dance )]->[rand 3];
print "$str\n";
DESCRIPTION
This module allows you to create strings which are interpolated, but not immediately.
Running the code in the SYNPOSIS will print the name of one of my favourite lords, even though at the time $str
was declared, the variables $role
and $thing
had still not been declared!
Discussion
How does this pass strictures? You might expect that the line which declares $str
would trigger a compile-time error, as it refers to two variables which don't exist. Fear not! delayed
is technically a quote-like operator, not a function; the string following it is parsed by Perl as an uninterpolated string, even if it appears in double quotes. We could equally have written:
my $str = delayed/$role of the $thing/;
I prefer the double-quoted style because it fares better with syntax highlighting.
What is $str
? It's actually a blessed object, but it uses UNIVERSAL::ref to conceal this fact. (blessed
from Scalar::Util knows the truth though.)
And it overloads stringification, right? By George! You've got it! Yes, it overloads stringification and plays silly games with PadWalker and String::Interpolate.
Methods
As mentioned above, strings with delayed interpolation are blessed objects. As such, they have methods:
new($text)
-
Object-oriented way to create a string with delayed interpretation, bypassing the
delayed
quote-like operator.my $str = "String::Interpolate::Delayed"->new('$foo');
interpolated
-
Retrieve the text as a Perl scalar string, performing interpolation.
The object overloads stringification to call this method. Passing a hashref as a parameter, allows you to define additional variables:
my $str = delayed "The $thing in $place @description.\n"; my $thing = "rain"; print $str->interpolated({ place => \"Spain", description => [qw/ stays mainly on the plain /], });
uninterpolated
-
Retrieve the text as a Perl scalar string, without performing interpolation.
ref
-
Just returns
undef
. This is for the benefit of UNIVERSAL::ref.
CAVEATS
Limitations on interpolation
Most variables, including lexical variables and "magic" variables (such as $1
, $_
, etc) will work. There's one significant exception: @_
. This limitation is inherited from String::Interpolate
.
Danger, Will Robinson!!
Interpolated Perl strings can execute arbitrary code:
my $str = "I think I might @{[ unlink '/etc/passwd' ]}";
This is a caveat with interpolated strings in Perl in general, however String::Interpolate::Delayed makes it easier to fall into this trap, because you might be tempted to load strings with delayed interpolation from an untrusted external source and throw them at the OO constructor.
String::Interpolate
This module includes a workaround for a bug in String::Interpolate. If the bug is fixed, the workaround may stop working. The workaround can be disabled by setting
$String::Interpolate::Delayed::WORKAROUND = 0;
BUGS
forkprove
Test suite fails when run using App::ForkProve, but runs fine using App::Prove. I don't know what all that's about...
Bug tracker
Please report any other bugs to http://rt.cpan.org/Dist/Display.html?Queue=String-Interpolate-Delayed.
SEE ALSO
String::Interpolate, PerlX::QuoteOperator.
AUTHOR
Toby Inkster <tobyink@cpan.org>.
COPYRIGHT AND LICENCE
This software is copyright (c) 2013 by Toby Inkster.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
DISCLAIMER OF WARRANTIES
THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.