Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
Sub::Quote(3)	      User Contributed Perl Documentation	 Sub::Quote(3)

       Sub::Quote - Efficient generation of subroutines	via string eval

	package	Silly;

	use Sub::Quote qw(quote_sub unquote_sub	quoted_from_sub);

	quote_sub 'Silly::kitty', q{ print "meow" };

	quote_sub 'Silly::doggy', q{ print "woof" };

	my $sound = 0;

	quote_sub 'Silly::dagron',
	  q{ print ++$sound % 2	? 'burninate' :	'roar' },
	  { '$sound' =>	\$sound	};

       And elsewhere:

	Silly->kitty;  # meow
	Silly->doggy;  # woof
	Silly->dagron; # burninate
	Silly->dagron; # roar
	Silly->dagron; # burninate

       This package provides performant	ways to	generate subroutines from

	my $coderef = quote_sub	'Foo::bar', q{ print $x++ . "\n" }, { '$x' => \0 };

       Arguments: ?$name, $code, ?\%captures, ?\%options

       $name is	the subroutine where the coderef will be installed.

       $code is	a string that will be turned into code.

       "\%captures" is a hashref of variables that will	be made	available to
       the code.  The keys should be the full name of the variable to be made
       available, including the	sigil.	The values should be references	to the
       values.	The variables will contain copies of the values.  See the
       "SYNOPSIS"'s "Silly::dagron" for	an example using captures.

       Exported	by default.


	 Boolean.  Set this option to not install the generated	coderef	into
	 the passed subroutine name on undefer.

	 Boolean.  Prevents a Sub::Defer wrapper from being generated for the
	 quoted	sub.  If the sub will most likely be called at some point,
	 setting this is a good	idea.  For a sub that will most	likely be
	 inlined, it is	not recommended.

	 The package that the quoted sub will be evaluated in.	If not
	 specified, the	package	from sub calling "quote_sub" will be used.

	 The value of $^H  to use for the code being evaluated.	 This captures
	 the settings of the strict pragma.  If	not specified, the value from
	 the calling code will be used.

	 The value of "${^WARNING_BITS}"  to use for the code being evaluated.
	 This captures the warnings set.  If not specified, the	warnings from
	 the calling code will be used.

	 The value of "%^H"  to	use for	the code being evaluated.  This
	 captures additional pragma settings.  If not specified, the value
	 from the calling code will be used if possible	(on perl 5.10+).

	 The "Subroutine Attributes" in	perlsub	to apply to the	sub generated.
	 Should	be specified as	an array reference.  The attributes will be
	 applied to both the generated sub and the deferred wrapper, if	one is

	 The apparent filename to use for the code being evaluated.

	 The apparent line number to use for the code being evaluated.

	my $coderef = unquote_sub $sub;

       Forcibly	replace	subroutine with	actual code.

       If $sub is not a	quoted sub, this is a no-op.

       Exported	by default.

	my $data = quoted_from_sub $sub;

	my ($name, $code, $captures, $compiled_sub) = @$data;

       Returns original	arguments to quote_sub,	plus the compiled version if
       this sub	has already been unquoted.

       Note that $sub can be either the	original quoted	version	or the
       compiled	version	for convenience.

       Exported	by default.

	my $prelude = capture_unroll '$captures', {
	  '$x' => 1,
	  '$y' => 2,
	}, 4;

	my $inlined_code = inlinify q{
	  my ($x, $y) =	@_;

	  print	$x + $y	. "\n";
	}, '$x,	$y', $prelude;

       Takes a string of code, a string	of arguments, a	string of code which
       acts as a "prelude", and	a Boolean representing whether or not to
       localize	the arguments.

	my $quoted_value = quotify $value;

       Quotes a	single (non-reference) scalar value for	use in a code string.
       The result should reproduce the original	value, including strings,
       undef, integers,	and floating point numbers.  The resulting floating
       point numbers (including	infinites and not a number) should be
       precisely equal to the original,	if possible.  The exact	format of the
       resulting number	should not be relied on, as it may include hex floats
       or math expressions.

	my $prelude = capture_unroll '$captures', {
	  '$x' => 1,
	  '$y' => 2,
	}, 4;

       Arguments: $from, \%captures, $indent

       Generates a snippet of code which is suitable to	be used	as a prelude
       for "inlinify".	$from is a string will be used as a hashref in the
       resulting code.	The keys of %captures are the names of the variables
       and the values are ignored.  $indent is the number of spaces to indent
       the result by.

	my $hash = {
	 coderef => qsub q{ print "hello"; },
	 other	 => 5,

       Arguments: $code

       Works exactly like "quote_sub", but includes a prototype	to only	accept
       a single	parameter.  This makes it easier to include in hash structures
       or lists.

       Exported	by default.

	my $var_name = '$variable_for_'	. sanitize_identifier('@name');
	quote_sub qq{ print \$${var_name} }, { $var_name => \$value };

       Arguments: $identifier

       Sanitizes a value so that it can	be used	in an identifier.

       Causes code to be output	to "STDERR" before being evaled.  Several
       forms are supported:

       1   All subs will be output.

	   Subs	will be	output if their	code matches the given regular

	   Any sub with	the given name will be output.

	   A sub matching the full name	will be	output.

	   Any sub in the given	package	(including anonymous subs) will	be

       Much of this is just string-based code-generation, and as a result, a
       few caveats apply.

       Calling "return"	from a quote_sub'ed sub	will not likely	do what	you
       intend.	Instead	of returning from the code you defined in "quote_sub",
       it will return from the overall function	it is composited into.

       So when you pass	in:

	  quote_sub q{	return 1 if $condition;	$morecode }

       It might	turn up	in the intended	context	as follows:

	 sub foo {

	   <important code a>
	   do {
	     return 1 if $condition;
	   <important code b>


       Which will obviously return from	foo, when all you meant	to do was
       return from the code context in quote_sub and proceed with running
       important code b.

       "Sub::Quote" preserves the environment of the code creating the quoted
       subs.  This includes the	package, strict, warnings, and any other
       lexical pragmas.	 This is done by prefixing the code with a block that
       sets up a matching environment.	When inlining "Sub::Quote" subs, care
       should be taken that user pragmas won't effect the rest of the code.

       Users' IRC: #moose on

       Development and contribution IRC: #web-simple on


       Git repository: <git://>

       Git browser: <>

       mst - Matt S. Trout (cpan:MSTROUT) <>

       frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <>

       ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <>

       Mithaldu	- Christian Walde (cpan:MITHALDU)

       tobyink - Toby Inkster (cpan:TOBYINK) <>

       haarg - Graham Knop (cpan:HAARG)	<>

       bluefeet	- Aran Deltac (cpan:BLUEFEET) <>

       ether - Karen Etheridge (cpan:ETHER) <>

       dolmen -	Olivier	MenguA(C) (cpan:DOLMEN)	<>

       alexbio - Alessandro Ghedini (cpan:ALEXBIO) <>

       getty - Torsten Raudssus	(cpan:GETTY) <>

       arcanez - Justin	Hunter (cpan:ARCANEZ) <>

       kanashiro - Lucas Kanashiro (cpan:KANASHIRO)

       djerius - Diab Jerius (cpan:DJERIUS) <>

       Copyright (c) 2010-2016 the Sub::Quote "AUTHOR" and "CONTRIBUTORS" as
       listed above.

       This library is free software and may be	distributed under the same
       terms as	perl itself. See <>.

perl v5.32.1			  2019-10-01			 Sub::Quote(3)


Want to link to this manual page? Use this URL:

home | help