File Coverage

blib/lib/String/Interpolate/Named.pm
Criterion Covered Total %
statement 91 93 97.8
branch 27 30 90.0
condition 22 28 78.5
subroutine 10 10 100.0
pod 3 3 100.0
total 153 164 93.2


line stmt bran cond sub pod time code
1             #! perl
2              
3             package String::Interpolate::Named;
4              
5 8     8   102995 use warnings;
  8         19  
  8         330  
6 8     8   48 use strict;
  8         27  
  8         203  
7 8     8   5276 use utf8;
  8         123  
  8         43  
8 8     8   339 use Carp qw( carp croak );
  8         15  
  8         535  
9              
10 8     8   3416 use parent 'Exporter';
  8         2615  
  8         51  
11             our @EXPORT = qw( interpolate );
12              
13             =head1 NAME
14              
15             String::Interpolate::Named - Interpolated named arguments in string
16              
17             =cut
18              
19             our $VERSION = '1.03';
20              
21             =head1 SYNOPSIS
22              
23             use String::Interpolate::Named;
24              
25             my $ctl = { args => { fn => "Johan", ln => "Bach" } };
26             say interpolate( $ctl, "The famous %{fn} %{ln}." );
27              
28             # If you like object orientation.
29             my $int = String::Interpolate::Named->new( { args => { ... } } );
30             say $int->interpolate("The famous %{fn} %{ln}.");
31              
32             =head1 DESCRIPTION
33              
34             String::Interpolate::Named provides a function to interpolate named
35             I by I in a template string. The target texts
36             are provided to the function via a hash, where the keys correspond to
37             the named argument to be replaced, or a subroutine that performs the
38             lookup.
39              
40             =head2 Named Arguments
41              
42             The arguments to be replaced are marked in the template by enclosing
43             them between C<%{> and C<}>. For example, the string C<"The famous
44             %{fn} %{ln}."> contains two named arguments, C and C.
45              
46             Note that the activator may be changed from C<%> into something else,
47             see below. Throughout this document we use the default value.
48              
49             =head2 Basic Interpolation
50              
51             When interpolated, the keys C and C are looked up in the hash,
52             and the corresponding values are substituted. If no value was found
53             for a named argument, nothing is substituted and the C<%{...}> is
54             removed.
55              
56             You can precede C<%>, C<{>, C<}> (and C<|>, see below) with a
57             backslash C<\> to hide their special meanings. For example, C<\}> will
58             I be considered closing an argument but yield a plain C<}> in the
59             text.
60              
61             =head2 Conditional Interpolation
62              
63             It is possible to select replacement values depending on whether
64             the named argument has a value or not:
65              
66             "This book has %{title|title %{title}}"
67             "This book has %{title|title %{title}|no title}"
68              
69             These are considered C<%{if|then}> and C<%{if|then|else}> cases.
70              
71             Assuming argument C has the value C<"My Book">, in the first </td> </tr> <tr> <td class="h" > <a name="72">72</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> example the text C<"title My Book">, the 'then' text, will be </td> </tr> <tr> <td class="h" > <a name="73">73</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> substituted, resulting in </td> </tr> <tr> <td class="h" > <a name="74">74</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="75">75</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "This book has title My Title" </td> </tr> <tr> <td class="h" > <a name="76">76</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="77">77</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> If C<title> does not have a value, the empty string is substituted. In </td> </tr> <tr> <td class="h" > <a name="78">78</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> the second example, the string C<"no title">, the 'else' text, will be </td> </tr> <tr> <td class="h" > <a name="79">79</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> substituted. </td> </tr> <tr> <td class="h" > <a name="80">80</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="81">81</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> As can be seen, the replacement texts may contain interpolations as </td> </tr> <tr> <td class="h" > <a name="82">82</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> well. For convenience, you can use C<%{}> to refer to the value of the </td> </tr> <tr> <td class="h" > <a name="83">83</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> named argument currently being examinated. The last example above can </td> </tr> <tr> <td class="h" > <a name="84">84</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> be written more shortly and elegantly as: </td> </tr> <tr> <td class="h" > <a name="85">85</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="86">86</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "This book has %{title|title %{}|no title}" </td> </tr> <tr> <td class="h" > <a name="87">87</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="88">88</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Testing Values </td> </tr> <tr> <td class="h" > <a name="89">89</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="90">90</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Instead of testing for named variables to have a value, you can also </td> </tr> <tr> <td class="h" > <a name="91">91</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> test for specific values: </td> </tr> <tr> <td class="h" > <a name="92">92</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="93">93</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "This takes %{days=1|%{} day|%{} days}" </td> </tr> <tr> <td class="h" > <a name="94">94</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="95">95</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 List Values </td> </tr> <tr> <td class="h" > <a name="96">96</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="97">97</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The replacement values hash may be scalar (in general: strings and </td> </tr> <tr> <td class="h" > <a name="98">98</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> numbers) or lists of scalars. If a value is a list of scalars, it is </td> </tr> <tr> <td class="h" > <a name="99">99</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> possible to select a particular value from the list by appending an </td> </tr> <tr> <td class="h" > <a name="100">100</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> index (period and a number) to the named argument. </td> </tr> <tr> <td class="h" > <a name="101">101</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="102">102</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Assume C<customer> has value C<[ "Jones", "Smith" ]>, then: </td> </tr> <tr> <td class="h" > <a name="103">103</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="104">104</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "%{customer.1} will be Smith" </td> </tr> <tr> <td class="h" > <a name="105">105</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "%{customer.2} will be Jones" </td> </tr> <tr> <td class="h" > <a name="106">106</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "%{customer} will be Jones Smith" </td> </tr> <tr> <td class="h" > <a name="107">107</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="108">108</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> When the value exceeds the number of elements in the list, an empty </td> </tr> <tr> <td class="h" > <a name="109">109</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> value is returned. </td> </tr> <tr> <td class="h" > <a name="110">110</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> When no element is selected the values are concatenated. </td> </tr> <tr> <td class="h" > <a name="111">111</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="112">112</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 The Control Hash </td> </tr> <tr> <td class="h" > <a name="113">113</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="114">114</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The interpolation process requires two parameters: a hash with </td> </tr> <tr> <td class="h" > <a name="115">115</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> settings and values for the named arguments, and the string to be used </td> </tr> <tr> <td class="h" > <a name="116">116</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> as a template for interpolation. The hash will be further referred to </td> </tr> <tr> <td class="h" > <a name="117">117</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> as the I<control hash>. </td> </tr> <tr> <td class="h" > <a name="118">118</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="119">119</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The hash can have the following keys: </td> </tr> <tr> <td class="h" > <a name="120">120</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="121">121</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =over </td> </tr> <tr> <td class="h" > <a name="122">122</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="123">123</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item args </td> </tr> <tr> <td class="h" > <a name="124">124</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="125">125</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This is either a hash that contains replacement texts for the named </td> </tr> <tr> <td class="h" > <a name="126">126</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> variables, or a subroutine that gets called with a variable as </td> </tr> <tr> <td class="h" > <a name="127">127</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> argument and returns a replacement value. </td> </tr> <tr> <td class="h" > <a name="128">128</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="129">129</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This element should be considered mandatory. </td> </tr> <tr> <td class="h" > <a name="130">130</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="131">131</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item separator </td> </tr> <tr> <td class="h" > <a name="132">132</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="133">133</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The separator used to concatenate list values, see L<List Values> above. </td> </tr> <tr> <td class="h" > <a name="134">134</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="135">135</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> It defaults to Perl variable C<$"> that, on its turn, defaults to a </td> </tr> <tr> <td class="h" > <a name="136">136</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> single space. </td> </tr> <tr> <td class="h" > <a name="137">137</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="138">138</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item activator </td> </tr> <tr> <td class="h" > <a name="139">139</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="140">140</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This is a single character that activates interpolation. By default </td> </tr> <tr> <td class="h" > <a name="141">141</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> this is the percent C<%> character. </td> </tr> <tr> <td class="h" > <a name="142">142</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="143">143</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item keypattern </td> </tr> <tr> <td class="h" > <a name="144">144</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="145">145</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The pattern to match key names. Default is C<qr/\w+[-_\w.]*/>. </td> </tr> <tr> <td class="h" > <a name="146">146</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="147">147</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item maxiter </td> </tr> <tr> <td class="h" > <a name="148">148</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="149">149</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> To enable nested substitutions and recursive replacement, the </td> </tr> <tr> <td class="h" > <a name="150">150</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> interpolation process is repeated until there are no more </td> </tr> <tr> <td class="h" > <a name="151">151</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> interpolations to be made. The maximun number of iterations is limited </td> </tr> <tr> <td class="h" > <a name="152">152</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> to the value of C<maxiter>. </td> </tr> <tr> <td class="h" > <a name="153">153</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="154">154</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> By default maxiter is 16. </td> </tr> <tr> <td class="h" > <a name="155">155</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="156">156</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =back </td> </tr> <tr> <td class="h" > <a name="157">157</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="158">158</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> An example of a control hash: </td> </tr> <tr> <td class="h" > <a name="159">159</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="160">160</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my %ctl = </td> </tr> <tr> <td class="h" > <a name="161">161</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> ( args => { </td> </tr> <tr> <td class="h" > <a name="162">162</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> customer => [ "Jones", "Smith" ], </td> </tr> <tr> <td class="h" > <a name="163">163</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> days => 2, </td> </tr> <tr> <td class="h" > <a name="164">164</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> title => "My Title", </td> </tr> <tr> <td class="h" > <a name="165">165</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> }, </td> </tr> <tr> <td class="h" > <a name="166">166</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> separator => ", ", </td> </tr> <tr> <td class="h" > <a name="167">167</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> ); </td> </tr> <tr> <td class="h" > <a name="168">168</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="169">169</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Object Oriented API </td> </tr> <tr> <td class="h" > <a name="170">170</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="171">171</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $ii = String::Interpolate::Named->new; </td> </tr> <tr> <td class="h" > <a name="172">172</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $ii->ctl(\%ctl); </td> </tr> <tr> <td class="h" > <a name="173">173</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $result = $ii->interpolate($template); </td> </tr> <tr> <td class="h" > <a name="174">174</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="175">175</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> For convenience, the control hash may be passed to the constructor: </td> </tr> <tr> <td class="h" > <a name="176">176</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="177">177</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $ii = String::Interpolate::Named->new(\%ctl); </td> </tr> <tr> <td class="h" > <a name="178">178</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $result = $ii->interpolate($template); </td> </tr> <tr> <td class="h" > <a name="179">179</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="180">180</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Functional API </td> </tr> <tr> <td class="h" > <a name="181">181</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="182">182</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> String::Interpolate::Named privides a single function, C<interpolate>, </td> </tr> <tr> <td class="h" > <a name="183">183</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> which is exported by default. </td> </tr> <tr> <td class="h" > <a name="184">184</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="185">185</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The subroutine takes two arguments: a reference to a control hash and </td> </tr> <tr> <td class="h" > <a name="186">186</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> the template string. </td> </tr> <tr> <td class="h" > <a name="187">187</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="188">188</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $result = interpolate( \%ctl, $template ); </td> </tr> <tr> <td class="h" > <a name="189">189</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="190">190</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="191">191</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="192">192</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 METHODS </td> </tr> <tr> <td class="h" > <a name="193">193</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="194">194</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 new </td> </tr> <tr> <td class="h" > <a name="195">195</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="196">196</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Constructs a new String::Interpolate::Named object. </td> </tr> <tr> <td class="h" > <a name="197">197</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="198">198</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $ii = String::Interpolate::Named->new; </td> </tr> <tr> <td class="h" > <a name="199">199</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="200">200</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> or </td> </tr> <tr> <td class="h" > <a name="201">201</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="202">202</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $ii = String::Interpolate::Named->new(\%ctl); </td> </tr> <tr> <td class="h" > <a name="203">203</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="204">204</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="205">205</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="206">206</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub new { </td> </tr> <tr> <td class="h" > <a name="207">207</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#207-1"> 2 </a> </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#207-1"> 1 </a> </td> <td > 1220 </td> <td class="s"> my ( $pkg, $ctl ) = @_; </td> </tr> <tr> <td class="h" > <a name="208">208</a> </td> <td class="c3" > 2 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#208-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 13 </td> <td class="s"> $ctl //= {}; </td> </tr> <tr> <td class="h" > <a name="209">209</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> bless $ctl => $pkg; </td> </tr> <tr> <td class="h" > <a name="210">210</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="211">211</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="212">212</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 ctl </td> </tr> <tr> <td class="h" > <a name="213">213</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="214">214</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Associates a control has with an existing object. </td> </tr> <tr> <td class="h" > <a name="215">215</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="216">216</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $ii->ctl(\%ctl); </td> </tr> <tr> <td class="h" > <a name="217">217</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="218">218</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="219">219</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="220">220</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub ctl { </td> </tr> <tr> <td class="h" > <a name="221">221</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#221-1"> 1 </a> </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#221-1"> 1 </a> </td> <td > 14 </td> <td class="s"> my ( $self, $ctl ) = @_; </td> </tr> <tr> <td class="h" > <a name="222">222</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> $self->{$_} = $ctl->{$_} for keys(%$ctl); </td> </tr> <tr> <td class="h" > <a name="223">223</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3 </td> <td class="s"> return $self; </td> </tr> <tr> <td class="h" > <a name="224">224</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="225">225</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="226">226</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 interpolate </td> </tr> <tr> <td class="h" > <a name="227">227</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="228">228</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This routine performs the actual interpolations. It can be used as a method: </td> </tr> <tr> <td class="h" > <a name="229">229</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="230">230</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $ii->interpolate($template); </td> </tr> <tr> <td class="h" > <a name="231">231</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="232">232</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> and functional: </td> </tr> <tr> <td class="h" > <a name="233">233</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="234">234</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> interpolate( \%ctl, $template ); </td> </tr> <tr> <td class="h" > <a name="235">235</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="236">236</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="237">237</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="238">238</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub interpolate { </td> </tr> <tr> <td class="h" > <a name="239">239</a> </td> <td class="c3" > 289 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#239-1"> 289 </a> </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#239-1"> 1 </a> </td> <td > 167230 </td> <td class="s"> my ( $ctl, $tpl ) = @_; </td> </tr> <tr> <td class="h" > <a name="240">240</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="241">241</a> </td> <td class="c3" > 289 </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#241-1"> 50 </a> </td> <td >   </td> <td >   </td> <td > 1306 </td> <td class="s"> my $maxiter = $ctl->{maxiter} // 16; </td> </tr> <tr> <td class="h" > <a name="242">242</a> </td> <td class="c3" > 289 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#242-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 1021 </td> <td class="s"> my $activator = $ctl->{activator} // '%'; </td> </tr> <tr> <td class="h" > <a name="243">243</a> </td> <td class="c3" > 289 </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#243-1"> 66 </a> </td> <td >   </td> <td >   </td> <td > 1415 </td> <td class="s"> my $keypat = $ctl->{keypattern} // qr/\w+[-_\w.]*/; </td> </tr> <tr> <td class="h" > <a name="244">244</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="245">245</a> </td> <td class="c3" > 289 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 878 </td> <td class="s"> for ( my $cnt = 1; $cnt <= $maxiter; $cnt++ ) { </td> </tr> <tr> <td class="h" > <a name="246">246</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="247">247</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 959 </td> <td class="s"> my $prev = $tpl; </td> </tr> <tr> <td class="h" > <a name="248">248</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="249">249</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Hide escaped specials by replacing them with Unicode noncharacters. </td> </tr> <tr> <td class="h" > <a name="250">250</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1031 </td> <td class="s"> $tpl =~ s/\\\\/\x{fdd0}/g; </td> </tr> <tr> <td class="h" > <a name="251">251</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 880 </td> <td class="s"> $tpl =~ s/\\\{/\x{fdd1}/g; </td> </tr> <tr> <td class="h" > <a name="252">252</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 813 </td> <td class="s"> $tpl =~ s/\\\}/\x{fdd2}/g; </td> </tr> <tr> <td class="h" > <a name="253">253</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 898 </td> <td class="s"> $tpl =~ s/\\\|/\x{fdd3}/g; </td> </tr> <tr> <td class="h" > <a name="254">254</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1547 </td> <td class="s"> $tpl =~ s/\\\Q$activator\E/\x{fdd4}/g; </td> </tr> <tr> <td class="h" > <a name="255">255</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="256">256</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Replace some seqs by a single char for easy matching. </td> </tr> <tr> <td class="h" > <a name="257">257</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1325 </td> <td class="s"> $tpl =~ s/\Q$activator\E\{\}/\x{fdde}/g; </td> </tr> <tr> <td class="h" > <a name="258">258</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1531 </td> <td class="s"> $tpl =~ s/\Q$activator\E\{/\x{fddf}/g; </td> </tr> <tr> <td class="h" > <a name="259">259</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="260">260</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # %{ key [ .index ] [ = value ] [ | then [ | else ] ] } </td> </tr> <tr> <td class="h" > <a name="261">261</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="262">262</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 926 </td> <td class="s"> my $pre = ''; </td> </tr> <tr> <td class="h" > <a name="263">263</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 790 </td> <td class="s"> my $post = ''; </td> </tr> <tr> <td class="h" > <a name="264">264</a> </td> <td class="c3" > 534 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#264-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 3755 </td> <td class="s"> if ( $tpl =~ s; ( ^ </td> </tr> <tr> <td class="h" > <a name="265">265</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?<pre> .*? ) </td> </tr> <tr> <td class="h" > <a name="266">266</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> \x{fddf} </td> </tr> <tr> <td class="h" > <a name="267">267</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?<key> $keypat ) </td> </tr> <tr> <td class="h" > <a name="268">268</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?: (?<op> \= ) </td> </tr> <tr> <td class="h" > <a name="269">269</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?<test> [^|}\x{fddf}]*) )? </td> </tr> <tr> <td class="h" > <a name="270">270</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?: \| (?<then> [^|}\x{fddf}]* ) </td> </tr> <tr> <td class="h" > <a name="271">271</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?: \| (?<else> [^|}\x{fddf}]* ) )? </td> </tr> <tr> <td class="h" > <a name="272">272</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> )? </td> </tr> <tr> <td class="h" > <a name="273">273</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> \} </td> </tr> <tr> <td class="h" > <a name="274">274</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?<post> .* ) </td> </tr> <tr> <td class="h" > <a name="275">275</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $ </td> </tr> <tr> <td class="h" > <a name="276">276</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> ) </td> </tr> <tr> <td class="h" > <a name="277">277</a> </td> <td class="c3" > 8 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#277-1"> 8 </a> </td> <td >   </td> <td > 8812 </td> <td class="s"> ; _interpolate($ctl, {%+} ) ;exso ) { </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 8 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4237 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 8 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 6289 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 245 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4340 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="278">278</a> </td> <td class="c3" > 245 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1041 </td> <td class="s"> $pre = $+{pre}; </td> </tr> <tr> <td class="h" > <a name="279">279</a> </td> <td class="c3" > 245 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 952 </td> <td class="s"> $post = $+{post}; </td> </tr> <tr> <td class="h" > <a name="280">280</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="281">281</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="282">282</a> </td> <td class="c3" > 289 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 522 </td> <td class="s"> $pre = $tpl; </td> </tr> <tr> <td class="h" > <a name="283">283</a> </td> <td class="c3" > 289 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 471 </td> <td class="s"> $tpl = ''; </td> </tr> <tr> <td class="h" > <a name="284">284</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="285">285</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1689 </td> <td class="s"> for ( $pre, $tpl, $post ) { </td> </tr> <tr> <td class="h" > <a name="286">286</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Unescape escaped specials. </td> </tr> <tr> <td class="h" > <a name="287">287</a> </td> <td class="c3" > 1602 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 2507 </td> <td class="s"> s/\x{fdd0}/\\\\/g; </td> </tr> <tr> <td class="h" > <a name="288">288</a> </td> <td class="c3" > 1602 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 2239 </td> <td class="s"> s/\x{fdd1}/\\\{/g; </td> </tr> <tr> <td class="h" > <a name="289">289</a> </td> <td class="c3" > 1602 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 2268 </td> <td class="s"> s/\x{fdd2}/\\\}/g; </td> </tr> <tr> <td class="h" > <a name="290">290</a> </td> <td class="c3" > 1602 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 2307 </td> <td class="s"> s/\x{fdd3}/\\\|/g; </td> </tr> <tr> <td class="h" > <a name="291">291</a> </td> <td class="c3" > 1602 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 2257 </td> <td class="s"> s/\x{fdd4}/\\$activator/g; </td> </tr> <tr> <td class="h" > <a name="292">292</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="293">293</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Restore (some) seqs. </td> </tr> <tr> <td class="h" > <a name="294">294</a> </td> <td class="c3" > 1602 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 2262 </td> <td class="s"> s/\x{fdde}/$activator."{}"/ge; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 6 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 21 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="295">295</a> </td> <td class="c3" > 1602 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 2562 </td> <td class="s"> s/\x{fddf}/$activator."{"/ge; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 43 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 161 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="296">296</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="297">297</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1631 </td> <td class="s"> $tpl =~ s/\\(\Q$activator\E|[{}|\\])/$1/g; </td> </tr> <tr> <td class="h" > <a name="298">298</a> </td> <td class="c3" > 534 </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#298-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 1249 </td> <td class="s"> warn ("'$prev' => '$pre' '$tpl' '$post'\n" ) if $ctl->{trace}; </td> </tr> <tr> <td class="h" > <a name="299">299</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="300">300</a> </td> <td class="c3" > 534 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1152 </td> <td class="s"> my $t = $pre . $tpl . $post; </td> </tr> <tr> <td class="h" > <a name="301">301</a> </td> <td class="c3" > 534 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#301-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 1203 </td> <td class="s"> if ( $prev eq $t ) { </td> </tr> <tr> <td class="h" > <a name="302">302</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # De-escape in subst part only (issue #6); </td> </tr> <tr> <td class="h" > <a name="303">303</a> </td> <td class="c3" > 289 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 713 </td> <td class="s"> $tpl =~ s/\\(\Q$activator\E|[{}|])/$1/g; </td> </tr> <tr> <td class="h" > <a name="304">304</a> </td> <td class="c3" > 289 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1632 </td> <td class="s"> return $pre . $tpl . $post; </td> </tr> <tr> <td class="h" > <a name="305">305</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="306">306</a> </td> <td class="c3" > 245 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 414 </td> <td class="s"> $tpl = $t; </td> </tr> <tr> <td class="h" > <a name="307">307</a> </td> <td class="c3" > 245 </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#307-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 906 </td> <td class="s"> warn("$cnt: $prev -> $tpl\n") if $ctl->{trace}; </td> </tr> <tr> <td class="h" > <a name="308">308</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="309">309</a> </td> <td class="c0" > <a href="#351"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> Carp::croak("Maximum number of iterations exceeded"); </td> </tr> <tr> <td class="h" > <a name="310">310</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="311">311</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="312">312</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub _interpolate { </td> </tr> <tr> <td class="h" > <a name="313">313</a> </td> <td class="c3" > 245 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#313-1"> 245 </a> </td> <td >   </td> <td > 618 </td> <td class="s"> my ( $ctl, $i ) = @_; </td> </tr> <tr> <td class="h" > <a name="314">314</a> </td> <td class="c3" > 245 </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#314-1"> 50 </a> </td> <td >   </td> <td >   </td> <td > 701 </td> <td class="s"> my $key = $i->{key} // ''; </td> </tr> <tr> <td class="h" > <a name="315">315</a> </td> <td class="c3" > 245 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 423 </td> <td class="s"> my $m = $ctl->{args}; </td> </tr> <tr> <td class="h" > <a name="316">316</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="317">317</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Establish the value for this key. </td> </tr> <tr> <td class="h" > <a name="318">318</a> </td> <td class="c3" > 245 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 375 </td> <td class="s"> my $val = ''; </td> </tr> <tr> <td class="h" > <a name="319">319</a> </td> <td class="c3" > 245 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 347 </td> <td class="s"> my $inx = 0; </td> </tr> <tr> <td class="h" > <a name="320">320</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="321">321</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Split off possible index. </td> </tr> <tr> <td class="h" > <a name="322">322</a> </td> <td class="c3" > 245 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#322-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 648 </td> <td class="s"> if ( $key =~ /^(.*)\.(-?\d+)$/ ) { </td> </tr> <tr> <td class="h" > <a name="323">323</a> </td> <td class="c3" > 7 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 23 </td> <td class="s"> ( $key, $inx ) = ( $1, $2 ); </td> </tr> <tr> <td class="h" > <a name="324">324</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="325">325</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="326">326</a> </td> <td class="c3" > 245 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#326-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 829 </td> <td class="s"> my $t = ref($m) eq 'CODE' ? $m->($key) : $m->{$key}; </td> </tr> <tr> <td class="h" > <a name="327">327</a> </td> <td class="c3" > 245 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#327-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 790 </td> <td class="s"> if ( defined $t ) { </td> </tr> <tr> <td class="h" > <a name="328">328</a> </td> <td class="c3" > 174 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 270 </td> <td class="s"> $val = $t; </td> </tr> <tr> <td class="h" > <a name="329">329</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="330">330</a> </td> <td class="c3" > 174 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#330-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 536 </td> <td class="s"> if ( UNIVERSAL::isa( $val, 'ARRAY' ) ) { </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#-2"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="331">331</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # 1, 2, ... selects 1st, 2nd value; -1 counts from end. </td> </tr> <tr> <td class="h" > <a name="332">332</a> </td> <td class="c3" > 161 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#332-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 305 </td> <td class="s"> if ( $inx ) { </td> </tr> <tr> <td class="h" > <a name="333">333</a> </td> <td class="c3" > 6 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#333-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 22 </td> <td class="s"> if ( $inx > 0 ) { </td> </tr> <tr> <td class="h" > <a name="334">334</a> </td> <td class="c3" > 4 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#334-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 10 </td> <td class="s"> if ( $inx <= @$val ) { </td> </tr> <tr> <td class="h" > <a name="335">335</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> $val = $val->[$inx-1]; </td> </tr> <tr> <td class="h" > <a name="336">336</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="337">337</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="338">338</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3 </td> <td class="s"> $val = ""; </td> </tr> <tr> <td class="h" > <a name="339">339</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="340">340</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="341">341</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="342">342</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 6 </td> <td class="s"> $val = $val->[$inx]; </td> </tr> <tr> <td class="h" > <a name="343">343</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="344">344</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="345">345</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Zero or none means concatenate all. </td> </tr> <tr> <td class="h" > <a name="346">346</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="347">347</a> </td> <td class="c3" > 155 </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#347-1"> 66 </a> </td> <td >   </td> <td >   </td> <td > 695 </td> <td class="s"> $val = join( $ctl->{separator} // $", @$val ); </td> </tr> <tr> <td class="h" > <a name="348">348</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="349">349</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="350">350</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> elsif ( $inx ) { </td> </tr> <tr> <td class="h" > <a name="351">351</a> </td> <td class="c0" > 0 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> Carp::croak("Expecting an array for variable '$key'") </td> </tr> <tr> <td class="h" > <a name="352">352</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="353">353</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="354">354</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="355">355</a> </td> <td class="c3" > 245 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 414 </td> <td class="s"> my $subst = ''; </td> </tr> <tr> <td class="h" > <a name="356">356</a> </td> <td class="c3" > 245 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#356-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 574 </td> <td class="s"> if ( $i->{op} ) { </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#-2"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="357">357</a> </td> <td class="c3" > 66 </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#357-1"> 50 </a> </td> <td >   </td> <td >   </td> <td > 195 </td> <td class="s"> my $test = $i->{test} // ''; </td> </tr> <tr> <td class="h" > <a name="358">358</a> </td> <td class="c3" > 66 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#358-1"> 100 </a> </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#358-1"> 66 </a> </td> <td >   </td> <td >   </td> <td > 268 </td> <td class="s"> if ( $i->{op} eq '=' && $val eq $test ) { </td> </tr> <tr> <td class="h" > <a name="359">359</a> </td> <td class="c3" > 30 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#359-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 112 </td> <td class="s"> $subst = $i->{then} // ''; </td> </tr> <tr> <td class="h" > <a name="360">360</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="361">361</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="362">362</a> </td> <td class="c3" > 36 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#362-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 117 </td> <td class="s"> $subst = $i->{else} // ''; </td> </tr> <tr> <td class="h" > <a name="363">363</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="364">364</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="365">365</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> elsif ( $val ne '' ) { </td> </tr> <tr> <td class="h" > <a name="366">366</a> </td> <td class="c3" > 124 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#366-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 411 </td> <td class="s"> $subst = $i->{then} // $val; </td> </tr> <tr> <td class="h" > <a name="367">367</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="368">368</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="369">369</a> </td> <td class="c3" > 55 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#369-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 187 </td> <td class="s"> $subst = $i->{else} // ''; </td> </tr> <tr> <td class="h" > <a name="370">370</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="371">371</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="372">372</a> </td> <td class="c3" > 245 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 564 </td> <td class="s"> $subst =~ s/\x{fdde}/$val/g; </td> </tr> <tr> <td class="h" > <a name="373">373</a> </td> <td class="c3" > 245 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1073 </td> <td class="s"> return $subst; </td> </tr> <tr> <td class="h" > <a name="374">374</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="375">375</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="376">376</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 REQUIREMENTS </td> </tr> <tr> <td class="h" > <a name="377">377</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="378">378</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Minimal Perl version 5.10.1. </td> </tr> <tr> <td class="h" > <a name="379">379</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="380">380</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 AUTHOR </td> </tr> <tr> <td class="h" > <a name="381">381</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="382">382</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Johan Vromans, C<< <JV at CPAN dot org> >> </td> </tr> <tr> <td class="h" > <a name="383">383</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="384">384</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 SUPPORT </td> </tr> <tr> <td class="h" > <a name="385">385</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="386">386</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Development of this module takes place on GitHub: </td> </tr> <tr> <td class="h" > <a name="387">387</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<https://github.com/sciurius/perl-String-Interpolate-Named>. </td> </tr> <tr> <td class="h" > <a name="388">388</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="389">389</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> You can find documentation for this module with the perldoc command. </td> </tr> <tr> <td class="h" > <a name="390">390</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="391">391</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> perldoc String::Interpolate::Named </td> </tr> <tr> <td class="h" > <a name="392">392</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="393">393</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Please report any bugs or feature requests using the issue tracker on </td> </tr> <tr> <td class="h" > <a name="394">394</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> GitHub. </td> </tr> <tr> <td class="h" > <a name="395">395</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="396">396</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 ACKNOWLEDGEMENTS </td> </tr> <tr> <td class="h" > <a name="397">397</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="398">398</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Many of the existing template / interpolate / substitute modules. </td> </tr> <tr> <td class="h" > <a name="399">399</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="400">400</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 COPYRIGHT & LICENSE </td> </tr> <tr> <td class="h" > <a name="401">401</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="402">402</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Copyright 2018,2019 Johan Vromans, all rights reserved. </td> </tr> <tr> <td class="h" > <a name="403">403</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="404">404</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This program is free software; you can redistribute it and/or modify it </td> </tr> <tr> <td class="h" > <a name="405">405</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> under the same terms as Perl itself. </td> </tr> <tr> <td class="h" > <a name="406">406</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="407">407</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="408">408</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="409">409</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1; # End of String::Interpolate::Named </td> </tr> </table> </body> </html>