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.